公開鍵の暗号化


秘密鍵の暗号化には共有鍵が必要ですが、どのように鍵を渡しますか?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"));
 }
}