Java编程实现非对称加密的方法详解
本文实例讲述了Java编程实现非对称加密的方法。分享给大家供大家参考,具体如下:
对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(publickey,简称公钥)和私有密钥(privatekey,简称私钥)。
是一种高级的双保险加密方式,一般的实现加密方式有DH密钥交换算法,RSA基于因子分解算法,ElGamal离散对数算法及ECC椭圆曲线加密等。
DH加密解密
/**
*非对称加密之:DH加密
*非对称DH,是安全性基于在有限域中计算离散对数的难度的一种加密算法。
*可用于密钥分发,但不能用于加/解密报文。DH即Diffie-Hellman算法的简写,也缩写为D-H算法。
*D-H加密算法的核心思想就是大素数不可分解质因数的数学理论方法。
*@description:
*@date2015-10-29上午9:08:14
*/
publicclassEncryptDH{
privatestaticStringdhStr="encrypttestbyDH";
publicstaticvoidmain(String[]args){
jdkDh();
}
privatestaticvoidjdkDh(){
try{
//初始化发送方密钥
KeyPairGeneratorsenderKeyPairGenerator=KeyPairGenerator.getInstance("DH");
senderKeyPairGenerator.initialize(512);
KeyPairsenderKeyPair=senderKeyPairGenerator.generateKeyPair();
byte[]senderPublicKeyEnc=senderKeyPair.getPublic().getEncoded();//发送方的公钥,发送给接受方,发送方式多种,比如文件,网络等
//初始化接受方密钥
KeyFactoryreceiverKeyFactory=KeyFactory.getInstance("DH");
X509EncodedKeySpecx509EncodedKeySpec=newX509EncodedKeySpec(senderPublicKeyEnc);
PublicKeyreceiverPublicKey=receiverKeyFactory.generatePublic(x509EncodedKeySpec);
DHParameterSpecdhParameterSpec=((DHPublicKey)receiverPublicKey).getParams();
KeyPairGeneratorreceiverKeyPairGenerator=KeyPairGenerator.getInstance("DH");
receiverKeyPairGenerator.initialize(dhParameterSpec);
KeyPairreceiveKeyPair=receiverKeyPairGenerator.generateKeyPair();
PrivateKeyreceiverPrivateKey=receiveKeyPair.getPrivate();
byte[]receiverPublicKeyEnc=receiveKeyPair.getPublic().getEncoded();
//密钥构建
KeyAgreementreceiverKeyAgreement=KeyAgreement.getInstance("DH");
receiverKeyAgreement.init(receiverPrivateKey);
receiverKeyAgreement.doPhase(receiverPublicKey,true);
SecretKeyreceiverSecretKey=receiverKeyAgreement.generateSecret("DES");
KeyFactorysenderKeyFactory=KeyFactory.getInstance("DH");
x509EncodedKeySpec=newX509EncodedKeySpec(receiverPublicKeyEnc);
PublicKeysenderPublicKey=senderKeyFactory.generatePublic(x509EncodedKeySpec);
KeyAgreementsenderKeyAgreement=KeyAgreement.getInstance("DH");
senderKeyAgreement.init(senderKeyPair.getPrivate());
senderKeyAgreement.doPhase(senderPublicKey,true);
SecretKeysnederSecretKey=senderKeyAgreement.generateSecret("DES");
if(Objects.equals(receiverSecretKey,snederSecretKey)){
System.out.println("双方密钥相同");
}
//加密
Ciphercipher=Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE,snederSecretKey);
byte[]result=cipher.doFinal(dhStr.getBytes());
System.out.println("DH加密后为:"+Base64.encode(result));
//解密
cipher.init(Cipher.DECRYPT_MODE,receiverSecretKey);
result=cipher.doFinal(result);
System.out.println("DH解密后为:"+newString(result));
}
catch(Exceptione){
e.printStackTrace();
}
}
}
RSA加密解密
/**
*非对称加密之:RSA加密
*@description:
*RSA公钥加密算法是1977年由罗纳德·李维斯特(RonRivest)、阿迪·萨莫尔(AdiShamir)和伦纳德·阿德曼(LeonardAdleman)一起提出的。
*1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
*RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
*今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
*但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。
*RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
*@date2015-10-29上午9:08:14
*/
publicclassEncryptRSA{
privatestaticStringrsaStr="encrypttestbyElGamal";
publicstaticvoidmain(String[]args){
jdkRSA();
}
privatestaticvoidjdkRSA(){
try{
//初始化密钥
KeyPairGeneratorkeyPairGenerator=KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPairkeyPair=keyPairGenerator.generateKeyPair();
RSAPublicKeyrsaPublicKey=(RSAPublicKey)keyPair.getPublic();
RSAPrivateKeyrsaPrivateKey=(RSAPrivateKey)keyPair.getPrivate();
System.out.println("RSA公钥:"+Base64.encode(rsaPublicKey.getEncoded()));
System.out.println("RSA私钥:"+Base64.encode(rsaPrivateKey.getEncoded()));
//私钥加密,公钥解密--加密
PKCS8EncodedKeySpecpkcs8EncodedKeySpec=newPKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactorykeyFactory=KeyFactory.getInstance("RSA");
PrivateKeyprivateKey=keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Ciphercipher=Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,privateKey);
byte[]result=cipher.doFinal(rsaStr.getBytes());
System.out.println("RSA私钥加密,公钥解密--加密:"+Base64.encode(result));
//私钥加密,公钥解密--解密
X509EncodedKeySpecx509EncodedKeySpec=newX509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory=KeyFactory.getInstance("RSA");
PublicKeypublicKey=keyFactory.generatePublic(x509EncodedKeySpec);
cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,publicKey);
result=cipher.doFinal(result);
System.out.println("RSA私钥加密,公钥解密--解密:"+newString(result));
//公钥加密,私钥解密--加密
x509EncodedKeySpec=newX509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory=KeyFactory.getInstance("RSA");
publicKey=keyFactory.generatePublic(x509EncodedKeySpec);
cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
result=cipher.doFinal(rsaStr.getBytes());
System.out.println("公钥加密,私钥解密--加密:"+Base64.encode(result));
//公钥加密,私钥解密--解密
pkcs8EncodedKeySpec=newPKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
keyFactory=KeyFactory.getInstance("RSA");
privateKey=keyFactory.generatePrivate(pkcs8EncodedKeySpec);
cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
result=cipher.doFinal(result);
System.out.println("公钥加密,私钥解密--解密:"+newString(result));
}
catch(Exceptione){
e.printStackTrace();
}
}
}
ElGamal加密
/**
*非对称加密之:ElGamal加密
*@description:
*ElGamal算法,是一种较为常见的加密算法,它是基于1984年提出的公钥密码体制和椭圆曲线加密体系。
*既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。
*在加密过程中,生成的密文长度是明文的两倍,且每次加密后都会在密文中生成一个随机数K,
*在密码中主要应用离散对数问题的几个性质:求解离散对数(可能)是困难的,而其逆运算指数运算可以应用平方-乘的方法有效地计算。
*也就是说,在适当的群G中,指数函数是单向函数。
*@date2015-10-29上午9:08:14
*/
publicclassEncrypElGamal{
privatestaticStringrsaStr="encrypttestbyElGamal";
publicstaticvoidmain(String[]args){
jdkRSA();
}
privatestaticvoidjdkRSA(){
try{
//公钥加密,私钥解密
//Security.addProvider(newBouncyCastleProvider());//需要添加bouncycastleproviderjar
//初始化密钥
AlgorithmParameterGeneratoralgorithmParameterGenerator=AlgorithmParameterGenerator.getInstance("ElGamal");
algorithmParameterGenerator.init(256);
AlgorithmParametersalgorithmParameters=algorithmParameterGenerator.generateParameters();
DHParameterSpecdhParameterSpec=algorithmParameters.getParameterSpec(DHParameterSpec.class);
KeyPairGeneratorkeyPairGenerator=KeyPairGenerator.getInstance("ElGamal");
keyPairGenerator.initialize(dhParameterSpec,newSecureRandom());
KeyPairkeyPair=keyPairGenerator.generateKeyPair();
PublicKeypublicKey=keyPair.getPublic();
PrivateKeyprivateKey=keyPair.getPrivate();
System.out.println("ElGamal加密公钥:"+Base64.encode(publicKey.getEncoded()));
System.out.println("ElGamal加密私钥:"+Base64.encode(privateKey.getEncoded()));
//加密解密同Rsa是一样的
}
catch(Exceptione){
e.printStackTrace();
}
}
}
Ecc加密可以参考:http://www.pediy.com/kssd/pediy06/pediy6014.htm等。
PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:
文字在线加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode
MD5在线加密工具:
http://tools.jb51.net/password/CreateMD5Password
在线散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
在线sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode
更多关于java相关内容感兴趣的读者可查看本站专题:《Java数学运算技巧总结》、《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《java日期与时间操作技巧汇总》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。