サーチ…


暗号ハッシュを計算する

異なるアルゴリズムを使用して比較的小さなデータブロックのハッシュを計算するには:

final MessageDigest md5 = MessageDigest.getInstance("MD5");
final MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
final MessageDigest sha256 = MessageDigest.getInstance("SHA-256");

final byte[] data = "FOO BAR".getBytes();

System.out.println("MD5    hash: " + DatatypeConverter.printHexBinary(md5.digest(data)));
System.out.println("SHA1   hash: " + DatatypeConverter.printHexBinary(sha1.digest(data)));
System.out.println("SHA256 hash: " + DatatypeConverter.printHexBinary(sha256.digest(data)));

この出力を生成します。

MD5    hash: E99E768582F6DD5A3BA2D9C849DF736E
SHA1   hash: 0135FAA6323685BA8A8FF8D3F955F0C36949D8FB
SHA256 hash: 8D35C97BCD902B96D1B551741BBE8A7F50BB5A690B4D0225482EAA63DBFB9DED

Javaプラットフォームの実装に応じて、追加のアルゴリズムを使用できます。

暗号的にランダムなデータを生成する

暗号的にランダムなデータのサンプルを生成するには:

final byte[] sample = new byte[16];

new SecureRandom().nextBytes(sample);

System.out.println("Sample: " + DatatypeConverter.printHexBinary(sample));

次のような出力を生成します。

Sample: E4F14CEA2384F70B706B53A6DF8C5EFE

nextBytes()呼び出しは、使用されているアルゴリズムによってエントロピーが集まる間にブロックされることに注意してください。

アルゴリズムとプロバイダを指定するには:

final byte[] sample = new byte[16];
final SecureRandom randomness = SecureRandom.getInstance("SHA1PRNG", "SUN");

randomness.nextBytes(sample);

System.out.println("Provider: " + randomness.getProvider());
System.out.println("Algorithm: " + randomness.getAlgorithm());
System.out.println("Sample: " + DatatypeConverter.printHexBinary(sample));

次のような出力を生成します。

Provider: SUN version 1.8
Algorithm: SHA1PRNG
Sample: C80C44BAEB352FD29FBBE20489E4C0B9

公開鍵/秘密鍵のペアを生成する

異なるアルゴリズムとキーサイズを使用してキーペアを生成するには:

final KeyPairGenerator dhGenerator = KeyPairGenerator.getInstance("DiffieHellman");
final KeyPairGenerator dsaGenerator = KeyPairGenerator.getInstance("DSA");
final KeyPairGenerator rsaGenerator = KeyPairGenerator.getInstance("RSA");

dhGenerator.initialize(1024);
dsaGenerator.initialize(1024);
rsaGenerator.initialize(2048);

final KeyPair dhPair = dhGenerator.generateKeyPair();
final KeyPair dsaPair = dsaGenerator.generateKeyPair();
final KeyPair rsaPair = rsaGenerator.generateKeyPair();

追加のアルゴリズムとキーサイズは、Javaプラットフォームの実装で利用できる場合があります。

キーを生成する際に使用する乱数の発生源を指定するには:

final KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");

generator.initialize(2048, SecureRandom.getInstance("SHA1PRNG", "SUN"));

final KeyPair pair = generator.generateKeyPair();

デジタル署名の計算と検証

署名を計算するには:

final PrivateKey privateKey = keyPair.getPrivate();
final byte[] data = "FOO BAR".getBytes();
final Signature signer = Signature.getInstance("SHA1withRSA");

signer.initSign(privateKey);
signer.update(data);

final byte[] signature = signer.sign();

署名アルゴリズムは、鍵ペアを生成するために使用されるアルゴリズムと互換性がなければならないことに注意してください。

署名を検証するには:

final PublicKey publicKey = keyPair.getPublic();
final Signature verifier = Signature.getInstance("SHA1withRSA");

verifier.initVerify(publicKey);
verifier.update(data);

System.out.println("Signature: " + verifier.verify(signature));

この出力を生成します。

Signature: true

公開鍵/秘密鍵によるデータの暗号化と復号化

公開鍵でデータを暗号化するには:

final Cipher rsa = Cipher.getInstance("RSA");

rsa.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
rsa.update(message.getBytes());
final byte[] result = rsa.doFinal();

System.out.println("Message: " + message);
System.out.println("Encrypted: " + DatatypeConverter.printHexBinary(result));

次のような出力を生成します。

Message: Hello
Encrypted: 5641FBB9558ECFA9ED...

Cipherオブジェクトを作成するときは、使用されているキーのタイプと互換性のある変換を指定する必要があることに注意してください。サポートされている変換のリストについては、「 JCA標準アルゴリズム名 」を参照してください。 RSA暗号化データの場合、 message.getBytes()長さはキーのサイズより小さくなければなりません。詳細は、このSO回答を参照してください。

データを復号化するには:

final Cipher rsa = Cipher.getInstance("RSA");

rsa.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
rsa.update(cipherText);
final String result = new String(rsa.doFinal());

System.out.println("Decrypted: " + result);

次の出力を生成します。

Decrypted: Hello


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow