您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 电子商务 > RSA加密算法JAVA编程实现
一、RSA加密算法的原理(1)、RSA算法描述RSA公钥密码体制的基本原理:根据数论,寻求两个大素数比较简单,而将他们的乘积分解开则极为困难。(2)、RSA算法密钥计算过程:1.用户秘密选取两个大素数p和q,计算n=pq,n称为RSA算法的模数,公开。2.计算出n的欧拉函数(n)=(p-1)×(q-1),保密。3.从(1,(n))中随机地选择一个与(n)互素的数e作为加密密钥,公开。4.计算出满足下式的d作为解密密钥,保密。ed=1mod(n)(3)、RSA算法密钥:加密密钥PK=|e,n|公开解密密钥SK=|d,n|保密(4)、RSA算法加密解密过程:RSA算法属于分组密码,明文在加密前要进行分组,分组的值m要满足:0mn加密算法:C=E(m)≡memodn解密算法:m=D(c)≡cdmodn(5)、RSA算法的几点说明:1.对于RSA算法,相同的明文映射出相同的密文。2.RSA算法的密钥长度:是指模数n的长度,即n的二进制位数,而不是e或d的长度。3.RSA的保密性基于大数进行因式分解很花时间,因此,进行RSA加密时,应选足够长的密钥。512bit已被证明不安全,1024bit也不保险。4.RSA最快情况也比DES慢100倍,仅适合少量数据的加密。公钥e取较小值的方案不安全。二.RSA公钥加密算法的编程实现以下程序是java编写的实现RSA加密及解密的算法importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.NoSuchAlgorithmException;importjava.security.SecureRandom;importjava.security.interfaces.RSAPrivateKey;importjava.security.interfaces.RSAPublicKey;importjavax.crypto.Cipher;//RSATest类即为测试类publicclassRSATest{//主函数publicstaticvoidmain(String[]args){try{RSATestencrypt=newRSATest();StringencryptText=encryptText;//输入的明文KeyPairkeyPair=encrypt.generateKey();//调用函数生成密钥对,函数见下RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();byte[]e=encrypt.encrypt(publicKey,encryptText.getBytes());//调用自己编写的encrypt函数实现加密,byte[]de=encrypt.decrypt(privateKey,e);//调用自己编写的decrypt函数实现解密,System.out.println(toHexString(e));//输出结果,采用ASSIC码形式System.out.println(toHexString(de));}catch(Exceptione){e.printStackTrace();}}//generateKey密钥对生成函数的实现publicKeyPairgenerateKey()throwsNoSuchAlgorithmException{KeyPairGeneratorkeyPairGen=KeyPairGenerator.getInstance(RSA);//返回生成指定算法的public/private密钥对的KeyPairGenerator对象。keyPairGen.initialize(1024,newSecureRandom());//使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器。KeyPairkeyPair=keyPairGen.generateKeyPair();//生成一个密钥对returnkeyPair;}//encrypt加密函数protectedbyte[]encrypt(RSAPublicKeypublicKey,byte[]data){if(publicKey!=null){try{Ciphercipher=Cipher.getInstance(RSA);//返回实现指定转换的Cipher对象。cipher.init(Cipher.ENCRYPT_MODE,publicKey);//用密钥初始化此Cipher,第一个参数表示加密returncipher.doFinal(data);//按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此Cipher的初始化方式)。}catch(Exceptione){e.printStackTrace();}}returnnull;}//decrypt解密函数protectedbyte[]decrypt(RSAPrivateKeyprivateKey,byte[]raw){if(privateKey!=null){try{Ciphercipher=Cipher.getInstance(RSA);cipher.init(Cipher.DECRYPT_MODE,privateKey);//第一个参数表示解密returncipher.doFinal(raw);}catch(Exceptione){e.printStackTrace();}}returnnull;}//toHexString将字节数组变为ASSIC码表示的字符串publicstaticStringtoHexString(byte[]b){StringBuildersb=newStringBuilder(b.length*2);//构造一个不带任何字符的字符串生成器,其初始容量由capacity参数指定。for(inti=0;ib.length;i++){sb.append(HEXCHAR[(b[i]&0xf0)4]);//append方法始终将这些字符添加到生成器的末端;而insert方法则在指定的点添加字符。//调用HEXCHAR方法sb.append(HEXCHAR[b[i]&0x0f]);}returnsb.toString();}//构建一个HEXCHAR数组privatestaticchar[]HEXCHAR={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};}小结:RSA公开密钥的加密算法实现方法如上所述,我们先是调用API生成了RSA的密钥对,然后调用API实现了加密与解密,最终通过编译的函数实现了字符数组的字符串输出,且输出的是字符串的ASSIC.
本文标题:RSA加密算法JAVA编程实现
链接地址:https://www.777doc.com/doc-5355832 .html