RSA復号学習ノート
3099 ワード
RSA復号化の簡単な説明:
RSAは非対称暗号化方式であり,暗号解読は同じKeyではない.秘密鍵暗号化公開鍵の復号化は、暗号化される明文バイト長が鍵のバイト長より大きくならない11(例えば1024ビットの場合、暗号化されるデータ長は117バイトより大きくならない)、復号されるデータのバイト長が鍵のバイト長より大きくならない(例えば1024ビットの場合、128バイトより大きくならない)
RSA公開鍵秘密鍵の生成:
RSA公開鍵暗号化:
RSA秘密鍵の復号化:
RSAは非対称暗号化方式であり,暗号解読は同じKeyではない.秘密鍵暗号化公開鍵の復号化は、暗号化される明文バイト長が鍵のバイト長より大きくならない11(例えば1024ビットの場合、暗号化されるデータ長は117バイトより大きくならない)、復号されるデータのバイト長が鍵のバイト長より大きくならない(例えば1024ビットの場合、128バイトより大きくならない)
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);
//
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
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);
}
// , , 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);
}
//
String decryptData = new String(Base64.decodeBase64(os2.toByteArray()));