Javaを使用したRSA署名(SHA256withRSA)の付与と検証
RSA署名を使う
RSAを使った書名の付与と検証のプロセスをJavaで実現するための手順です。
一通りのやり方をまとめた資料がなかったので、ここに書いておきます。
何か、応用方法はありそうで面白いですね。
KeyPairGenerator generator;
try {
generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048);
KeyPair keyPair = generator.generateKeyPair();
RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();
// Modulusを表示 (公開鍵と秘密鍵の両方に入っている)
byte[] modulusBytes = publicKey.getModulus().toByteArray();
byte[] modulusBase64 = Base64.encodeBase64Chunked(modulusBytes);
System.out.println("[modulus]");
System.out.println(new String(modulusBase64));
// 公開鍵を表示
byte[] publicKeyBytes = publicKey.getPublicExponent().toByteArray();
byte[] publicKeyBase64 = Base64.encodeBase64Chunked(publicKeyBytes);
System.out.println("[public]");
System.out.println(new String(publicKeyBase64));
// 秘密鍵を表示
privateKey.ge
byte[] privateKeyBytes = privateKey.getPrivateExponent().toByteArray();
byte[] privateKeyBase64 = Base64.encodeBase64Chunked(privateKeyBytes);
System.out.println("[private]");
System.out.println(new String(privateKeyBase64));
// 署名対象データ
String message = "TESTDATA";
// 署名(秘密鍵)
Signature signer = Signature.getInstance("SHA256withRSA");
signer.initSign(privateKey);
signer.update(message.getBytes("UTF-8"));
byte[] sign = signer.sign();
byte[] signBase64 = Base64.encodeBase64Chunked(sign);
System.out.println("[sign]");
System.out.println(new String(signBase64));
// 検証(公開鍵)
Signature verifier = Signature.getInstance("SHA256withRSA");
verifier.initVerify(publicKey);
verifier.update(message.getBytes("UTF-8"));
boolean result = verifier.verify(sign);
System.out.println("verify=" + result);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}



