RSA加解密簡單說明:
RSA是非對稱加密方式,就是說加密解密不是同一個Key丁侄。私鑰加密公鑰解密,待加密的明文字節(jié)長度不能大于密鑰的字節(jié)長度減11(比如1024位的,那么待加密的數(shù)據(jù)長度不能大于117字節(jié))诫咱,待解密數(shù)據(jù)的字節(jié)長度不能大于密鑰的字節(jié)長度(比如1024位的就不能大于128字節(jié))
RSA公鑰私鑰的生成:
//獲取RSA密鑰生成器的實例,還可以是DES/AES等继找,當然這里只需要RSA
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//初始化密鑰的長度
keyPairGenerator.initialize(2048);
//生成密鑰對
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//獲取私鑰
PrivateKey privateKey = keyPair.getPrivate();
//獲取公鑰
PublicKey publicKey = keyPair.getPublic();
RSA公鑰加密:
//從Base64編碼的字符串生成公鑰
String publicKeyStr = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQ"
byte[] publicKeyBytes = Base64.decodeBase64(publicKeyStr .getBytes());
//這里需要注意一下遂跟,生成公鑰的spec只能是X509EncodedKeySpec或者RSAPublicKeySpec,私鑰只能是PKCS8EncodedKeySpec或者RSAPrivateKeySpec
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes );
PublicKey publicKey = KeyFactory
.getInstance("RSA")
.generatePublic(keySpec);
//待加密數(shù)據(jù)
String content = "Hello RSA 77 Hello RSA 77Hello RSA 77Hello RSA 77Hello RSA 77Hello RSA 77Hello RSA 77Hello RSA 77Hello RSA";
byte[] data = Base64.encodeBase64(content.getBytes());
//公鑰加密
Cipher rsa = Cipher.getInstance("RSA");
//初始化加密模式
rsa.init(Cipher.ENCRYPT_MODE, publicKey);
ByteArrayInputStream is = new ByteArrayInputStream(data );
ByteArrayOutputStream os = new ByteArrayOutputStream();
//這里是2048位密鑰婴渡,所以加密最大長度不能超過245字節(jié)
byte[] buffer = new byte[245];
int len;
while ((len = is.read(buffer)) != -1) {
byte[] doFinal = rsa.doFinal(buffer, 0, len);
int length = doFinal.length;
os.write(doFinal);
}
//加密后的數(shù)據(jù)幻锁,為了防止亂碼,這里將加密數(shù)據(jù)采用Base64編碼
String encryptedData = new String(Base64.encodeBase64(os.toByteArray()));
RSA私鑰解密:
//從Base64編碼的字符串生成私鑰
String privateKeyStr = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCDKI2SovlB9CcI/EztKXeiBQ5UMoGA";
byte[] privateKey_bytes = Base64.decodeBase64(privateKeyStr.getBytes());
//這里需要注意一下边臼,生成公鑰的spec只能是X509EncodedKeySpec或者RSAPublicKeySpec哄尔,私鑰只能是PKCS8EncodedKeySpec或者RSAPrivateKeySpec
PKCS8EncodedKeySpec sk_keySpec = new PKCS8EncodedKeySpec(privateKey_bytes);
PrivateKey privateKey = KeyFactory
.getInstance("RSA")
.generatePrivate(sk_keySpec);
//私鑰解密
Cipher rsa2 = Cipher.getInstance("RSA");
rsa2.init(Cipher.DECRYPT_MODE, privateKey);
byte[] input = Base64.decodeBase64(encryptedData.getBytes());
ByteArrayInputStream is2 = new ByteArrayInputStream(input);
ByteArrayOutputStream os2 = new ByteArrayOutputStream();
byte[] buffer2 = new byte[256];
int len2;
while ((len2 = is2.read(buffer2)) != -1) {
byte[] doFinal = rsa2.doFinal(buffer2, 0, len2);
os2.write(doFinal);
}
//解密后的數(shù)據(jù)
String decryptData = new String(Base64.decodeBase64(os2.toByteArray()));