公開鍵の暗号化
秘密鍵の暗号化には共有鍵が必要ですが、どのように鍵を渡しますか?Web環境では,直接伝達すると検出されやすく,幸いにも公開鍵暗号化が登場した.公開鍵暗号化は非対称暗号化とも呼ばれ、非対称アルゴリズムは一対の鍵対、一つの公開鍵、一つの秘密鍵を使用し、公開鍵で暗号化されたデータを使用し、秘密鍵だけが解くことができる(暗号化に使用できる).また,秘密鍵を用いて暗号化されたデータは,公開鍵のみが解ける(署名).しかし、速度は遅く(秘密鍵の暗号化より100~1000倍遅い)、公開鍵の主なアルゴリズムはRSAであり、Blowfish、Diffie-Helmanなども含まれ、jdk 1.5種はRSAのサポートを提供し、改善された場所である.
package com.ijo.security;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import javax.crypto.Cipher;
public class PublicExample {
public static void main(String[] args) throws Exception {
byte[] plainText = "Hellow china".getBytes("UTF8");
// RSA
System.out.println("Start generating RSA key");
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair key = keyGen.generateKeyPair();
System.out.println("Finish generating RSA key");
// RSA Cipher ,
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
System.out.println("" + cipher.getProvider().getInfo());
System.out.println("Start encryption");
cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
byte[] cipherText = cipher.doFinal(plainText);
System.out.println("Finish encryption:");
System.out.println(new String(cipherText, "UTF8"));
//
System.out.println("Start decryption");
cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());
byte[] newPlainText = cipher.doFinal(cipherText);
System.out.println("Finish decryption:");
System.out.println(new String(newPlainText, "UTF8"));
}
}