python字符串加密算法,非对称加密原理怎么算,python 非对称加密
从DH算法可以看出,由公钥和私钥组成的密钥对是一种非常方便的加密方法。公钥是公开的,私钥是完全保密的,这就为非对称加密奠定了基础。
不对称加密意味着加密和解密不使用同一个密钥。只有一对相同的公钥和私钥才能被成功解密。
所以,如果要对drdqt发送给cmdld的文件进行加密,必须先向cmdld请求她的公钥,然后用cmdld的公钥进行加密,将加密后的文件发送给cmdld。这个文件只能用cmd液晶屏的私钥解决。cmd LCD的私钥在她自己手里,除了cmd LCD没有人能解锁这个文件。
典型的加密算法是RSA算法,由罗恩里维斯特、阿迪萨莫尔和伦纳德阿德曼发明,所以用他们三个姓氏的首字母代表。
非对称加密相对于对称加密的一个明显优势是,对称加密需要协商密钥,而非对称加密可以安全地公开每个公钥。人与人之间的通信:使用非对称加密需要n个密钥对,每个人必须只管理自己的密钥对。另一方面,使用对称加密需要n*(N-1 )/2个密钥,所以每个人需要管理N-1个密钥,管理难度大,容易泄密。
既然非对称加密这么好,难道不能放弃对称加密,完全用非对称加密吗?不会吧。非对称加密的缺点是运算速度很慢,比对称加密慢很多。
因此,在实践中,不对称加密总是与对称加密一起使用。假设drdqt需要将加密文件传输到cmdld。他们首先交换公钥,然后。
Drdqt生成随机AES密码,用cmdld的公钥用RSA加密,发送给CMDLD;
Cmdld用自己的RSA私钥解密,获得AES密码;
使用共享的AES密码通过AES加密通信。
可以看出,非对称加密实际上应用于第一步,即“AES cipher”加密。这也是浏览器中常见的HTTPS协议惯例。也就是说,浏览器和服务器首先通过RSA交换AES密码,然后双方的通信实际上使用的是高速的AES对称密码,而不是低速的RSA非对称密码。
Java标准库提供了RSA算法的实现。示例代码如下:
导入Java . math . big integer;
导入Java . security . *;
导入javax . crypto . cipher;
-
类别所有者{
publistaticvoidmain(string[]args)引发异常{)。
//明文:
byte[] plain=你好,encryptuseRSA 。GetBytes( utf-8 );
创建//公钥/私钥对:
人民主动烟草=新人( wsdmz );
用wsdmz的公钥加密:
byte[]PK=active tickets . get public key(;
system . out . println(string . format(公钥:% x),newbiginger (1,pk)))
Byte[] encrypted=活动香烟。加密(普通;
system . out . println(string . format(加密3360 % x),new bigin integer(1,加密) )
用wsdmz的私钥解密:
byte[]sk=active tickets . getprivatekey(;
system . out . println(string . format(私钥:% x),new bigin integer(1,sk))
Byte[]解密=主动香烟。解密(加密;
System.out.println(新字符串(已解密, UTF-8 ));
}
}
类别{
字符串名称;
//私钥:
密钥sk;
//公钥:
公钥PK;
Public(字符串名称)引发GeneralSecurityException {
this.name=name
生成//公钥/私钥对:
keypairgeneratorkpgen=密钥对生成器. getinstance(RSA);
kpgen . initialize(1024;
密钥对KP=KP gen.generate密钥对(;
this . sk=KP . get private(;
this . PK=KP . get public(;
}
//将私钥导出到字节
公共字节[]获取私钥
返回this . sk . get encoded(;
}
//将公钥导出到字节
Public byte []获取公钥
返回this . PK . get encoded(;
}
//用公钥加密:
public byte[]encrypt[byte[]message]ThrowsGeneralSecurityException {
cipher cipher=cipher . getinstance(RSA);
cipher . init(cipher . encrypt _ mode,this . PK);
返回cipher.do final(消息;
}
//用私钥解密:
public byte[]decrypt(byte[]input)抛出GeneralSecurityException {
cipher cipher=cipher . getinstance(RSA);
cipher . init(cipher . decrypt _ mode,this . sk);
Return cipher.do final(输入;
}
}
RSA的公钥和私钥都可以在getEncoded()方法中检索byte[])表示的二进制数据,需要时保存到一个文件中。要从byte[]数组中恢复公钥或私钥,请编写以下内容:
byte[] pkData=。
byte[] skData=。
key factory KF=key factory . getinstance(RSA);
//恢复公钥:
x 59 encodedkeyspecpspec=new x509 encodedkeyspec(PK数据);
公钥PK=KF . generate public(PK spec);
//恢复私钥:
S8编码的keyspec=newpkcs8编码的keyspec (sk数据);
私钥sk=KF . generate private(sk spec);
以RSA算法为例,它的密钥有不同的长度,比如256/512/1024/2048/4096。长度越长,密码越强,当然计算速度也越慢。
如果改变要加密的byte[]数据的大小,可以看到使用512位RSA加密时明文长度不能超过53字节;使用1024位RSA加密时,明文长度不能超过117个字节。因此,当使用RSA时,它总是与AES一起使用。也就是说任意长度的明文用AES加密,AES密码用RSA加密。
另外,光靠非对称加密算法是无法防止中间人攻击的。
练习
摘要
非对称加密是指加密和解密不使用相同的密钥,只有相同的公钥-私钥对才能成功解密。
单独的非对称加密算法不能防止中间人攻击。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。