非对称加密
非对称加密算法又称为公开密钥加密算法,它需要两个密钥,一个称为公开密钥,即公钥;另一个称为私有密钥,即私钥。公钥和私钥需要配对使用,如果用公钥对数据进行加密,只有用对应的私钥才能进行解密,而如果使用私钥对数据进行加密,那么只有用对应的公钥才能进行解密。因为加密和解密使用的是两个不同的密钥,所以这种算法称为非对称加密算法。
非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公钥向其他人公开,得到该公钥的乙方使用密钥对机密信息进行加密后再发送给甲方,甲方再使用自己保存的另一把专用密钥(即私钥)对加密后的信息进行解密。
非对称加密算法的特点:对称加密算法中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥,所以保证其安全性就是保证密钥的安全,而一旦密钥在传输过程中泄漏,加密信息就不再安全。而非对称加密算法中包含有两种密钥,其中一个是公开的,这样就不需要像对称加密算法那样,需要传输密钥给对方进行数据加密了,大大地提高了加密算法的安全性。非对称加密算法能够保证,即使实在获知公钥、加密算法和加密算法源代码的情况下,也无法获得公钥对应的私钥,因此也无法对公钥加密的密文进行解密。
但是由于非对称加密算法的复杂性,使得其加密解密速度远没有对称加密解密的速度快。为了解决加密的速度问题,人们一般采取两种加密结合使用的办法,优缺点互补,达到时间和安全的平衡:对称加密算法加密速度快,人们用它来加密较长的文件,然后用非对称加密算法来给文件密钥加密,解决了对称加密算法的密钥分发问题。
当前使用最为广泛的非对称加密算法非RSA莫属。背包算法
1、RSA算法
RSA非对称加密算法是目前最有影响力的非对称加密算法,他能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但反过来想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
Java的RSA算法的基本使用:
生成公钥与私钥:
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(RSA);
keyPairGen.initialize(
1024
);//密码位数
公钥和私钥可以通过KeyPairGenerator执行generateKeyPair()后生成密钥对KeyPair,通过KeyPair.getPublic()和KeyPair.getPrivate()来获取。如下代码:
// 动态生成密钥对,这是当前最耗时的操作,一般要2s以上。
KeyPair keyPair = keyPairGen.generateKeyPair();
// 公钥
PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 私钥
PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
byte[]
publicKeyData = publicKey.getEncoded();
byte
[] privateKeyData = publicKey.getEncoded();
// 通过公钥byte[]将公钥还原,适用于RSA算法
public
static
PublicKey getPublicKey(
byte[] keyBytes)
throws NoSuchAlgorithmException,InvalidKeySpecException {
X509EncodedKeySpec keySpec =
new
X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return
publicKey;
// 通过私钥byte[]将公钥还原,适用于RSA算法
public
static
PrivateKey getPrivateKey(
byte[] keyBytes)
throws
NoSuchAlgorithmException, InvalidKeySpecException {
PKCS8EncodedKeySpec keySpec =
new
PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory =
KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return
privateKey;
使用1024初始化KeyPairGenerator,RSA加密后的密文的长度为1024位,即128个字节,此时明文的最大长度不能超过117个字节,超过117个字节需要使用2048的keysize来初始化KeyPairGenerator,超过245个字节则需要使用更高位数的keysize。RSA的keysize位数越高,其产生密钥对及加密、解密的速度越慢,这是基于大素数非对称加密算法的缺陷。