非对称加密--密钥交换算法DHCoder

/*
 * 密钥交换算法,即非对称加密算法
 * */
public class DHCoder {
        //非对称加密算法
        public static final String KEY_ALGORITHM= "DH";
        //本地密钥算法,即对称加密算法
        public static final String SECRET_ALGORITHM= "AES";
        private  static final int KEY_SIZE=512;
        //公钥
        private static final String PUBLIC_KEY= "DHPublicKey";
        //私钥
        private static final String PRIVATE_KEY= "DHPrivateKey";
       
        //初始化甲方密钥
        public static Map<String,Object> initKey() throws Exception{
               //密钥对生成器
              KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance( KEY_ALGORITHM);
              keyPairGenerator.initialize( KEY_SIZE);
              KeyPair keyPair=keyPairGenerator.generateKeyPair();
              
               //甲方公钥
              DHPublicKey publicKey=(DHPublicKey)keyPair.getPublic();
               //甲方私钥
              DHPrivateKey privateKey=(DHPrivateKey)keyPair.getPrivate();
              
               //将密钥对存储在Map中
              Map<String,Object> keyMap= new HashMap<String,Object>(2);
              keyMap.put( PUBLIC_KEY,publicKey);
              keyMap.put( PRIVATE_KEY,privateKey);
               return keyMap;
       }
       
       
        //乙方密钥
        public static Map<String,Object> initKey(byte[] key) throws Exception{
               //解析甲方公钥,转换公钥规范
              X509EncodedKeySpec x509KeySpec= new X509EncodedKeySpec(key);
              KeyFactory keyFactory=KeyFactory. getInstance(KEY_ALGORITHM);
               //产生甲方公钥
              PublicKey publicKey=keyFactory.generatePublic(x509KeySpec);
              
               //由甲方公钥构建乙方密钥对
              DHParameterSpec dhParamSpec=((DHPublicKey)publicKey).getParams();
              KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(keyFactory.getAlgorithm());
              keyPairGenerator.initialize(dhParamSpec);
              
               //产生密钥对
              KeyPair keyPair=keyPairGenerator.generateKeyPair();
               //乙方公钥
              DHPublicKey publicKey1=(DHPublicKey)keyPair.getPublic();
               //乙方私钥
              DHPrivateKey privateKey1=(DHPrivateKey)keyPair.getPrivate();
              
               //将密钥存储在Map中
              Map<String,Object> keyMap= new HashMap<String,Object>(2);
              keyMap.put( PRIVATE_KEY, privateKey1);
              keyMap.put( PUBLIC_KEY, publicKey1);
               return keyMap;
       }
       
       
        //加密
        public static byte[] encrypt(byte[] data, byte[] key) throws Exception, GeneralSecurityException{
               //生成本地密钥
              SecretKey secretKey= new SecretKeySpec(key, SECRET_ALGORITHM);
               //加密数据
              Cipher cipher=Cipher. getInstance(secretKey.getAlgorithm());
              cipher.init(Cipher. ENCRYPT_MODE, secretKey);
               return cipher.doFinal(data);
       }
       
        //解密
        public static byte[] decrypt(byte[] data, byte[] key) throws Exception, NoSuchPaddingException{
               //生成本地密钥
              SecretKey secretKey= new SecretKeySpec(key, SECRET_ALGORITHM);
              Cipher cipher=Cipher. getInstance(secretKey.getAlgorithm());
              cipher.init(Cipher. DECRYPT_MODE, secretKey);
               return cipher.doFinal(data);
       }
       
        //由公钥,私钥,构建本地密钥
        public static byte[] getSecretKey(byte[] publicKey, byte[] privateKey) throws Exception{
              KeyFactory keyFactory=KeyFactory. getInstance(KEY_ALGORITHM);
               //初始化公钥
              X509EncodedKeySpec x509EncodedKeySpec= new X509EncodedKeySpec(publicKey);
               //产生公钥
              PublicKey pubKey=keyFactory.generatePublic(x509EncodedKeySpec);
              
               //初始化私钥,密钥规范转换
              PKCS8EncodedKeySpec pkcs8KeySpec= new PKCS8EncodedKeySpec(privateKey);
               //产生私钥
              PrivateKey priKey=keyFactory.generatePrivate(pkcs8KeySpec);
              
               //实例化
              KeyAgreement keyAgree=KeyAgreement.getInstance(keyFactory.getAlgorithm());
              keyAgree.init(priKey);
              keyAgree.doPhase(pubKey, true);
              
               //生成本地密钥
              SecretKey secretKey=keyAgree.generateSecret( SECRET_ALGORITHM);
               return secretKey.getEncoded();
       }
       
        //取得私钥
        public static byte[] getPrivateKey(Map<String,Object> keyMap){
              Key key=(Key)keyMap.get( PRIVATE_KEY);
               return key.getEncoded();
       }
        //取得公钥
        public static byte[] getPublicKey(Map<String,Object> keyMap){
              Key key=(Key)keyMap.get( PUBLIC_KEY);
               return key.getEncoded();
       }
}

验证===
public class DHCoderTest {

        //初始化密钥
        public final void initKey() throws Exception{

       }
       
        public static void main(String[] args) throws Exception {
               // TODO Auto-generated method stub
              
               /*
               * 需要关注,甲乙双方本地密钥是否相同;一方加密,另一方是否可以解密
               */     

               //甲方公钥
               byte[] publicKey1;
               //甲方私钥
               byte[] privateKey1;
               //甲方本地密钥
               byte[] key1;
              
               //乙方公钥
               byte[] publicKey2;
               //一方私钥
               byte[] privateKey2;
               //一方本地密钥
               byte[] key2;
              
               //生成甲方密钥对
              Map<String,Object> keyMap1=DHCoder. initKey();
              privateKey1=DHCoder. getPrivateKey(keyMap1);
              publicKey1=DHCoder. getPublicKey(keyMap1);
              System. out.println("甲方公钥:\n" +Base64.encodeBase64String (publicKey1));
              System. out.println("甲方私钥:\n" +Base64.encodeBase64String (privateKey1));
              
               //由甲方产生乙方密钥对
              Map<String,Object> keyMap2=DHCoder. initKey(publicKey1);
              publicKey2=DHCoder. getPublicKey(keyMap2);
              privateKey2=DHCoder. getPrivateKey(keyMap2);
              System. out.println("乙方公钥:\n" +Base64.encodeBase64String (publicKey2));
              System. out.println("乙方私钥:\n" +Base64.encodeBase64String (privateKey2));
              
               //甲方私钥,乙方公钥,构造本地密钥
              key1=DHCoder. getSecretKey(publicKey2, privateKey1);
              System. out.println("甲方本地密钥:\n" +Base64.encodeBase64String (key1));
              
               //乙方私钥,甲方公钥,构造本地密钥
              key2=DHCoder. getSecretKey(publicKey1, privateKey2);
              System. out.println("乙方本地密钥:\n" +Base64.encodeBase64String (key2));
              
               //校验
               assertArrayEquals(key1,key2);
       }

}
posted @ 2014-08-30 11:20  徐小鱼  阅读(657)  评论(0编辑  收藏  举报