读书人

[转]JAVA下加密算法的实现用例-MD5/SH

发布时间: 2012-09-09 09:27:54 作者: rapoo

[转]JAVA上加密算法的实现用例-MD5/SHA1,DSA,DESede/DES,Diffie-Hellman的使用

通常,使用的加密算法 比较简便高效,密钥简短,加解密速度快,破译极其困难。本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman的使用。


[转]JAVA下加密算法的实现用例-MD5/SHA1,DSA,DESede/DES,Diffie-Hellman的使用
[转]JAVA下加密算法的实现用例-MD5/SHA1,DSA,DESede/DES,Diffie-Hellman的使用
回页首

*/                        import java.io.*;                        import java.math.BigInteger;                        import java.security.*;                        import java.security.spec.*;                        import java.security.interfaces.*;                        import javax.crypto.*;                        import javax.crypto.spec.*;                        import javax.crypto.interfaces.*;                        import com.sun.crypto.provider.SunJCE;                        public class testDHKey {                        public static void main(String argv[]) {                        try {                        testDHKey my= new testDHKey();                        my.run();                        } catch (Exception e) {                        System.err.println(e);                        }                        }                        private void run() throws Exception {                        Security.addProvider(new com.sun.crypto.provider.SunJCE());                        System.out.println("ALICE: 产生 DH 对 ...");                        KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance("DH");                        aliceKpairGen.initialize(512);                        KeyPair aliceKpair = aliceKpairGen.generateKeyPair(); //生成时间长                        // 张三(Alice)生成公共密钥 alicePubKeyEnc 并发送给李四(Bob) ,                        //比如用文件方式,socket.....                        byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded();                        //bob接收到alice的编码后的公钥,将其解码                        KeyFactory bobKeyFac = KeyFactory.getInstance("DH");                        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec  (alicePubKeyEnc);                        PublicKey alicePubKey = bobKeyFac.generatePublic(x509KeySpec);                        System.out.println("alice公钥bob解码成功");                        // bob必须用相同的参数初始化的他的DH KEY对,所以要从Alice发给他的公开密钥,                        //中读出参数,再用这个参数初始化他的 DH key对                        //从alicePubKye中取alice初始化时用的参数                        DHParameterSpec dhParamSpec = ((DHPublicKey)alicePubKey).getParams();                        KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance("DH");                        bobKpairGen.initialize(dhParamSpec);                        KeyPair bobKpair = bobKpairGen.generateKeyPair();                        System.out.println("BOB: 生成 DH key 对成功");                        KeyAgreement bobKeyAgree = KeyAgreement.getInstance("DH");                        bobKeyAgree.init(bobKpair.getPrivate());                        System.out.println("BOB: 初始化本地key成功");                        //李四(bob) 生成本地的密钥 bobDesKey                        bobKeyAgree.doPhase(alicePubKey, true);                        SecretKey bobDesKey = bobKeyAgree.generateSecret("DES");                        System.out.println("BOB: 用alice的公钥定位本地key,生成本地DES密钥成功");                        // Bob生成公共密钥 bobPubKeyEnc 并发送给Alice,                        //比如用文件方式,socket.....,使其生成本地密钥                        byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();                        System.out.println("BOB向ALICE发送公钥");                        // alice接收到 bobPubKeyEnc后生成bobPubKey                        // 再进行定位,使aliceKeyAgree定位在bobPubKey                        KeyFactory aliceKeyFac = KeyFactory.getInstance("DH");                        x509KeySpec = new X509EncodedKeySpec(bobPubKeyEnc);                        PublicKey bobPubKey = aliceKeyFac.generatePublic(x509KeySpec);                        System.out.println("ALICE接收BOB公钥并解码成功");                        ;                        KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("DH");                        aliceKeyAgree.init(aliceKpair.getPrivate());                        System.out.println("ALICE: 初始化本地key成功");                        aliceKeyAgree.doPhase(bobPubKey, true);                        // 张三(alice) 生成本地的密钥 aliceDesKey                        SecretKey aliceDesKey = aliceKeyAgree.generateSecret("DES");                        System.out.println("ALICE: 用bob的公钥定位本地key,并生成本地DES密钥");                        if (aliceDesKey.equals(bobDesKey)) System.out.println("张三和李四的密钥相同");                        //现在张三和李四的本地的deskey是相同的所以,完全可以进行发送加密,接收后解密,达到                        //安全通道的的目的                        /*                        * bob用bobDesKey密钥加密信息                        */                        Cipher bobCipher = Cipher.getInstance("DES");                        bobCipher.init(Cipher.ENCRYPT_MODE, bobDesKey);                        String bobinfo= "这是李四的机密信息";                        System.out.println("李四加密前原文:"+bobinfo);                        byte[] cleartext =bobinfo.getBytes();                        byte[] ciphertext = bobCipher.doFinal(cleartext);                        /*                        * alice用aliceDesKey密钥解密                        */                        Cipher aliceCipher = Cipher.getInstance("DES");                        aliceCipher.init(Cipher.DECRYPT_MODE, aliceDesKey);                        byte[] recovered = aliceCipher.doFinal(ciphertext);                        System.out.println("alice解密bob的信息:"+(new String(recovered)));                        if (!java.util.Arrays.equals(cleartext, recovered))                        throw new Exception("解密后与原文信息不同");                        System.out.println("解密后相同");                        }                        }

读书人网 >移动开发

热点推荐