NO3.Opensslは証明書を生成し、証明書の公開鍵暗号化秘密鍵復号をテストする
4121 ワード
一、公開鍵を取る、例中server.crtをDディスクルートの下に置く
二、秘密鍵の取得
1.serverを直接読み出す.keyファイルが間違っています.
serverをkeyファイルをPKCS 8形式に変換する:
コマンド:
PKCS 8形式の鍵を生成するmyrsakey_pcks8
myrsakey_pcks 8の内容:
2.仮にmyrsakey_pcks 8はDディスクルートディレクトリの下にあり、
//
CertificateFactory cf = CertificateFactory.getInstance("X.509");
//
FileInputStream fis = new FileInputStream("D:/server.crt");
//
Certificate cert = cf.generateCertificate(fis);
//
fis.close();
//
PublicKey publicKey = cert.getPublicKey();
二、秘密鍵の取得
1.serverを直接読み出す.keyファイルが間違っています.
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
serverをkeyファイルをPKCS 8形式に変換する:
コマンド:
openssl pkcs8 -topk8 -nocrypt -in server.key -out myrsakey_pcks8
PKCS 8形式の鍵を生成するmyrsakey_pcks8
myrsakey_pcks 8の内容:
-----BEGIN PRIVATE KEY-----
MIICXQIBAAKBgQDB49bqrPV4BEmoWmBsLy/JNVbWC1Rz/tkKAjvszeE+8cQwxmYQ
oJMKXcmYSV9NF/Ftxj+Fydu9iHM8FzEQjDoB9pxPIfV8n4+F1R0y5rrTzBwYXuAm
JSo0OnLGXVhJSjwOGu0vRu4SoSH+g0QKHuPDoOAfiKdnNQuJF0TGug5yGwIDAQAB
AoGAVqOd9K2m3qNj2qPP9Ge9fbak/+5+JXsatvs6ld2Fql/UYEs3bnSiX/56x975
g/SQAJKW7gy+cVoYzCA8330ZqeBq4GFhisXeCL7YDakFraFHALcYo19BWSc02N96
cuq9qU9E0ZMNDBPlLrUrJ34i33B4eX+h1CLhO7rJzoyMPZkCQQD62T5uZqTR/5Aw
Uw3F/IGctwVUMRu9VeLVYnDSIKZasalDXujGtFjyhk9df+mjSq6reH/gg5PLBSPv
WErT5B6lAkEAxd8nbXERRqLhQlnzL6CnoqpwjPL6E7pnb7qIrgYchaONUQvlCEaH
31uy1VyDxueB1UwfY6VjZGIkd6SmkqYxvwJBAO2PKVnCaVra7UFmlkemz1SL20cV
TtDq8mvk0zWcaA7B66t6yXXMu+PKIIVKqwfSpUKMVoZX9XIyBwsXEZ5DjmUCQQDB
9v1cT/DicDomY6x6rJ6HW1JXKLux6REKOi1PgdglvGyD3QgXc6QvdGE6u6TFrxzb
bPJ8KJzkwzwCOFm8+cNbAkBue461A4i616SH7Q/VQ3In0qGTZ5QwHksHV86vbfmM
S/v6T/SOYqP/zDmMuZhsa+FyBrV8feYOb4vgbXoDaJtM
-----END PRIVATE KEY-----
2.仮にmyrsakey_pcks 8はDディスクルートディレクトリの下にあり、
// KEY
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
// PKCS8
BufferedReader br = new BufferedReader(new FileReader("D:/rsakey_pcks8"));
//rsakey_pcks8 -----BEGIN PRIVATE KEY-----
String s = br.readLine();
StringBuffer sb = new StringBuffer();
// rsakey_pcks8
s = br.readLine();
//
while (s.charAt(0) != '-') {
sb.append(s + "\r");
s = br.readLine();
}
// base64 , org.apache.commons.codec.binary.Base64
byte[] keybyte = Base64.decodeBase64(sb.toString());
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keybyte);
//
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
三、公開鍵による暗号化//
public static byte[] cryptByPublicKey(PublicKey publicKey, int cipherMode,
byte[] bytes) throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(cipherMode, publicKey);
return cipher.doFinal(bytes);
}
公開鍵を使用して「12345」を暗号化byte[] b =cryptByPublicKey(publicKey, Cipher.ENCRYPT_MODE, "12345".getBytes());
四、秘密鍵で復号する//
public static byte[] cryptByPrivateKey(PrivateKey privateKey,
int cipherMode, byte[] plainTextBytes)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(cipherMode, privateKey);
return cipher.doFinal(plainTextBytes);
}
秘密鍵を使用して復号byte[] t = RSAUtil.cryptByPrivateKey(privateKey, Cipher.DECRYPT_MODE, b);
String out = new String(t, "utf-8");
System.out.println(out);
が終了しました.