天天看點

Java加密和數字簽名公鑰加密三

http://www.yuloo.com/news/0908/296030.html

公鑰加密:

  上面提到,私鑰加密需要一個共享的密鑰,那麼如何傳遞密鑰呢?web環境下,直接傳遞的話很容易被偵聽到,幸好有了公鑰加密的出現。公鑰加密也叫不對稱加密,不對稱算法使用一對密鑰對,一個公鑰,一個私鑰,使用公鑰加密的資料,隻有私鑰能解開(可用于加密);同時,使用私鑰加密的資料,隻有公鑰能解開(簽名)。但是速度很慢(比私鑰加密慢100到1000倍),公鑰的主要算法有RSA,還包括Blowfish,Diffie-Helman等,jdk1.5 種提供了對RSA的支援,是一個改進的地方:

  Java代碼

  

  import java.security.Key;

  import javax.crypto.Cipher;

  import java.security.KeyPairGenerator;

  import java.security.KeyPair;

  

  public class PublicExample{

  public static void main(String[] args) throws Exception{

  if(args.length!=1){

  System.err.println("Usage:java PublicExample <text>");

  System.exit(1);

  }

  byte[] plainText=args[0].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"));

  }

  }