您当前的位置:首页 > 互联网教程

Java生成RSA非对称型加密的公钥和私钥

发布时间:2025-05-19 12:04:27    发布人:远客网络

Java生成RSA非对称型加密的公钥和私钥

一、Java生成RSA非对称型加密的公钥和私钥

1、非对称型加密非常适合多个客户端和服务器之间的秘密通讯客户端使用同一个公钥将明文加密而这个公钥不能逆向的解密密文发送到服务器后有服务器端用私钥解密这样就做到了明文的加密传送

2、非对称型加密也有它先天的缺点加密解密速度慢制约了它的发挥如果你有大量的文字需要加密传送建议你通过非对称型加密来把对称型密钥分发到客户端及时更新对称型密钥

3、*<p>Title: RSA非对称型加密的公钥和私钥</p>

4、*<p>Description:</p>

5、*<p>Copyright: Copyright(c)</p>

6、 private KeyPairGenerator kpg= null;

7、 private PublicKey public_key= null;

8、 private PrivateKey private_key= null;

9、 private FileOutputStream public_file_out= null;

10、 private ObjectOutputStream public_object_out= null;

11、 private FileOutputStream private_file_out= null;

12、 private ObjectOutputStream private_object_out= null;

13、*@param in指定密匙长度(取值范围~)

14、*@throws NoSuchAlgorithmException异常

15、 public KeyRSA(int in String address) throws NoSuchAlgorithmException FileNotFoundException IOException

16、 kpg= KeyPairGenerator getInstance( RSA);//创建密匙对生成器

17、 kpg initialize(in);//指定密匙长度(取值范围~)

18、 kp= kpg genKeyPair();//生成密匙对其中包含着一个公匙和一个私匙的信息

19、 public_key= kp getPublic();//获得公匙

20、 private_key= kp getPrivate();//获得私匙

21、 public_file_out= new FileOutputStream(address+/public_key dat);

22、 public_object_out= new ObjectOutputStream(public_file_out);

23、 public_object_out writeObject(public_key);

24、 private_file_out= new FileOutputStream(address+/private_key dat);

25、 private_object_out= new ObjectOutputStream(private_file_out);

26、 private_object_out writeObject(private_key);

27、 public static void main(String[] args){

28、 System out println(私匙和公匙保存到C盘下的文件中);

29、 catch(NoSuchAlgorithmException ex){

二、Java和.NET使用DES对称加密的区别

1、没有区别,DES只是加密的一种算法,Java与.NET语言中只是对这种算法的实现,所以两者是没有任何区别的。算法与密钥本来就是分开的,算法本来就是公开的,语言只是对这种算法的实现而已,在这种情况下DES与语言没有任何相关性,只有自己的算法标准。

2、但很多人反映的Java中的DES/TDES与.NET中的DES/TDES不通用,其实并不存在这样的问题的。两者是几乎完全通用的。所以没有存在不通用的情况的。

3、由于语言的实现基于自己的习惯与理解上的不同,不同的语言采用了不同的默认参数(默认值),当然,就算在同种语言下,这些参数不同的时加密与解密也会有所不同的(只会默认默认参数就认为不通用的那些人,真想不通这个问题怎么提出来的)。

4、事实上DES除了一个key与iv(初始向量)必须保证相同外,还有对加密的不同解释参数,如mode与paddingmode。DES加密是是块加密的一种,在处理块级与未尾块级时,有不同的方式(mode)如电子密码本(CBC)之类的,每个参数有不同的加密行为与意义,当然这只是DES加密标准的一部分,并不能独立出去的。paddingMode则是则块加密当最后一个块不足时的填充方式。而在java与net实现加密或解密时都遵从标准,实现了不同的填充方式以供选择。但由于每个语言的默认值不同,如net中cbc是默认值,而Java中则是另外一个,填充方式的默认值也不相同,所以会出现不设计这两个参数时,在java与net通信时无法正确解密。所谓的不Java与net中DES不同,仅仅只是默认参数不同,如果你能正确设置这两个参数,几乎任何语言中DES加密与解密都是通用的(部分语言中并没有全部实现DES中的标准,所以可能会出现特定语言的某种加密方式无法在另一种语言中解析)。

5、所以,DES本身没有任何区别,他只是一个标准(你家交流电与他家交流电有什么区别?),对于不同的实现必须依赖于此标准实现,所以DES标准本身而言是相同的。如果说DES在Java与NET中的类库实现有什么区别,那么两种语言类库完全没可比性(两个人有什么区别,一张嘴两只眼睛的标准外,怕是没有相同之处了),而对于DES实现支持上,两者也是几乎相同,Java与net均实现了DES标准全部的规范。

6、最后想说的是,加密学中只介绍DES,并不说在不同语言中的实现,因为任何语言实现都依赖于相同的DES加解密算法。我觉得这个问题应该问成“在DES在java中与NET中实现的类库默认值有什么不同”才对。

三、Java加密和数字签名

1、 Java加密和数字签名本文主要谈一下密码学中的加密和数字签名以及其在java中如何进行使用对密码学有兴趣的伙伴推荐看 Bruce Schneier的著作 Applied Crypotography在jdk的发行版本中安全性方面有了很大的改进也提供了对RSA算法的直接支持现在我们从实例入手解决问题(本文仅是作为简单介绍)

2、这是一种与消息认证码结合使用以确保消息完整性的技术主要使用单向散列函数算法可用于检验消息的完整性和通过散列密码直接以文本形式保存等目前广泛使用的算法有MD MD SHA jdk对上面都提供了支持在java中进行消息摘要很简单 java security MessageDigest提供了一个简易的操作方法

3、/***MessageDigestExample java*Copyright*/ import java security MessageDigest;/***单一的消息摘要算法不使用密码可以用来对明文消息(如密码)隐藏保存*/ public class MessageDigestExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java MessageDigestExample text); System exit();}

4、 byte[] plainText=args[ ] getBytes( UTF);

5、//使用getInstance(算法)来获得消息摘要这里使用SHA的位算法 MessageDigest messageDigest=MessageDigest getInstance( SHA);

6、 System out println( \n+messageDigest getProvider() getInfo());//开始使用算法 messageDigest update(plainText); System out println( \nDigest:);//输出算法运算结果 System out println(new String(messageDigest digest() UTF));}}还可以通过消息认证码来进行加密实现 javax crypto Mac提供了一个解决方案有兴趣者可以参考相关API文档本文只是简单介绍什么是摘要算法

7、这里补充另一个运用消息摘要的方式加密的例子: public class TestEncrypt{

8、/***@param strSrc:strSrc is a string will be encrypted*@param encName: encName is the algorithm name will be used* encName dafault to MD*@return String*/ public String Encrypt(String strSrc String encName){

9、 MessageDigest md= null; String strDes= null;

10、 byte[] bt= strSrc getBytes(); try{ if(encName== null|| encName equals()){ encName= MD;} md= MessageDigest getInstance(encName); md update(bt); strDes= bytes Hex(md digest());//to HexString} catch(NoSuchAlgorithmException e){ System out println( Invalid algorithm); return null;} return strDes;}

11、 public String bytes Hex(byte[] bts){ String des=; String tmp= null; for(int i=; i< bts length; i++){ tmp=(Integer toHexString(bts[i]& xFF)); if(tmp length()==){ des+=;} des+= tmp;} return des;}

12、 public static void main(String[]args){ TestEncrypt te= new TestEncrypt(); String strSrc=可以加密汉字 Oh and english; System out println( Source String:+ strSrc); System out println( Encrypted String:); System out println( Use Def:+ te Encrypt(strSrc null)); System out println( Use MD:+ te Encrypt(strSrc MD)); System out println( Use SHA:+ te Encrypt(strSrc SHA)); System out println( Use SHA:+ te Encrypt(strSrc SHA));}}

13、另外在javawebparts中的 RequestHelpers里的generateGUID方法也涉及到了MD的方法代码如下: public static String generateGUID(HttpServletRequest request){

14、 String out=; try{// Construct a string that is prised of:// Remote IP Address+ Host IP Address+ Date(yyyyMMdd)+// Time(hhmmssSSa)+ Requested Path+ Session ID+// HashCode Of ParameterMap StringBuffer***= new StringBuffer();*** append(request getRemoteAddr()); InetAddress ia= InetAddress getLocalHost();*** append(ia getHostAddress());*** append(new SimpleDateFormat( yyyyMMddhhmmssSSa) format(new Date())); String path= request getServletPath(); String pathInfo= request getPathInfo(); if(pathInfo!= null){ path+= pathInfo;}*** append(path);*** append(request getSession(false));*** append(request getParameterMap() hashCode()); String str=*** toString();// Now encode the string using an MD encryption algorithm MessageDigest md= MessageDigest getInstance( md); md update(str getBytes()); byte[] digest= md digest(); StringBuffer hexStr= new StringBuffer(); for(int i=; i< digest length; i++){ str= Integer toHexString( xFF& digest[i]); if(str length()<){ str=+ str;} hexStr append(str);} out= hexStr toString();} catch(NoSuchAlgorithmException nsae){ log error(nsae);} catch(UnknownHostException uhe){ log error(uhe);}// Return the encrypted string It should be unique based on the// ponents that prise the plain text string and should always be// characters thanks to the MD algorithm return out;

15、消息摘要只能检查消息的完整性但是单向的对明文消息并不能加密要加密明文的消息的话就要使用其他的算法要确保机密性我们需要使用私钥密码术来交换私有消息

16、这种最好理解使用对称算法比如 A用一个密钥对一个文件加密而B读取这个文件的话则需要和A一样的密钥双方共享一个私钥(而在web环境下私钥在传递时容易被侦听)

17、使用私钥加密的话首先需要一个密钥可用javax crypto KeyGenerator产生一个密钥(java security Key)然后传递给一个加密工具(javax crypto Cipher)该工具再使用相应的算法来进行加密主要对称算法有 DES(实际密钥只用到位) AES(支持三种密钥长度位)通常首先位其他的还有DESede等 jdk种也提供了对对称算法的支持以下例子使用AES算法来加密

18、/***PrivateExmaple java*Copyright*/ import javax crypto Cipher; import javax crypto KeyGenerator; import java security Key;

19、/***私鈅加密保证消息机密性*/ public class PrivateExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java PrivateExample<text>); System exit();} byte[] plainText=args[ ] getBytes( UTF);

20、//通过KeyGenerator形成一个key System out println( \nStart generate AES key); KeyGenerator keyGen=KeyGenerator getInstance( AES); keyGen init(); Key key=keyGen generateKey(); System out println( Finish generating DES key);

21、//获得一个私鈅加密类Cipher ECB是加密方式 PKCS Padding是填充方法 Cipher cipher=Cipher getInstance( AES/ECB/PKCS Padding); System out println( \n+cipher getProvider() getInfo());

22、//使用私鈅加密 System out println( \nStart encryption:); cipher init(Cipher ENCRYPT_MODE key); byte[] cipherText=cipher doFinal(plainText); System out println( Finish encryption:); System out println(new String(cipherText UTF));

23、 System out println( \nStart decryption:); cipher init(Cipher DECRYPT_MODE key); byte[] newPlainText=cipher doFinal(cipherText); System out println( Finish decryption:);

24、 System out println(new String(newPlainText UTF));

25、上面提到私钥加密需要一个共享的密钥那么如何传递密钥呢?web环境下直接传递的话很容易被侦听到幸好有了公钥加密的出现公钥加密也叫不对称加密不对称算法使用一对密钥对一个公钥一个私钥使用公钥加密的数据只有私钥能解开(可用于加密)同时使用私钥加密的数据只有公钥能解开(签名)但是速度很慢(比私钥加密慢到倍)公钥的主要算法有RSA还包括Blowfish Diffie Helman等 jdk种提供了对RSA的支持是一个改进的地方

26、/***PublicExample java*Copyright*/ import java security Key; import javax crypto Cipher; import java security KeyPairGenerator; import java security KeyPair;/***一个简单的公鈅加密例子 Cipher类使用KeyPairGenerator生成的公鈅和私鈅*/ public class PublicExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java PublicExample<text>); System exit();}

27、 byte[] plainText=args[ ] getBytes( UTF);//构成一个RSA密钥 System out println( \nStart generating RSA key); KeyPairGenerator keyGen=KeyPairGenerator getInstance( RSA); keyGen initialize(); KeyPair key=keyGen generateKeyPair(); System out println( Finish generating RSA key);

28、//获得一个RSA的Cipher类使用公鈅加密 Cipher cipher=Cipher getInstance( RSA/ECB/PKCS Padding); System out println( \n+cipher getProvider() getInfo());

29、 System out println( \nStart encryption); cipher init(Cipher ENCRYPT_MODE key getPublic()); byte[] cipherText=cipher doFinal(plainText); System out println( Finish encryption:); System out println(new String(cipherText UTF));