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(); }