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

Java生成RSA非对称型加密的公钥和私钥,第1张

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

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

import java io *

import java security *

import javax crypto *

import javax crypto spec *

/**

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

* <p>Description: </p>

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

* <p>Company: </p>

* @author not attributable

* @version

*/

public class KeyRSA {

private KeyPairGenerator kpg = null

private KeyPair kp = null

private PublicKey public_key = null

private PrivateKey private_key = null

private FileOutputStream public_file_out = null

private ObjectOutputStream public_object_out = null

private FileOutputStream private_file_out = null

private ObjectOutputStream private_object_out = null

/**

* 构造函数

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

* @throws NoSuchAlgorithmException 异常

*/

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

{

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

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

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

public_key = kp getPublic()//获得公匙

private_key = kp getPrivate()//获得私匙

//保存公匙

public_file_out = new FileOutputStream(address + /public_key dat )

public_object_out = new ObjectOutputStream(public_file_out)

public_object_out writeObject(public_key)

//保存私匙

private_file_out = new FileOutputStream(address + /private_key dat )

private_object_out = new ObjectOutputStream(private_file_out)

private_object_out writeObject(private_key)

}

public static void main(String[] args) {

try {

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

new KeyRSA( c:/ )

}

catch (IOException ex) {

}

catch (NoSuchAlgorithmException ex) {

}

}

lishixinzhi/Article/program/Java/hx/201311/26592

鉴于rsa加密的重要性和相关源代码的匮乏 经过整理特此贴出 需要下载bcprov jdk jar import javax crypto Cipherimport java security *import java security spec RSAPublicKeySpecimport java security spec RSAPrivateKeySpecimport java security spec InvalidKeySpecExceptionimport java security interfaces RSAPrivateKeyimport java security interfaces RSAPublicKeyimport java io *import java math BigInteger/*** RSA 工具类 提供加密 解密 生成密钥对等方法 * 需要到下载bcprov jdk jar **/public class RSAUtil {/*** 生成密钥对* @return KeyPair* @throws EncryptException*/public static KeyPair generateKeyPair() throws EncryptException {try {KeyPairGenerator keyPairGen = KeyPairGenerator getInstance( RSA new bouncycastle jce provider BouncyCastleProvider())final int KEY_SIZE = //没什么好说的了 这个值关系到块加密的大小 可以更改 但是不要太大 否则效率会低keyPairGen initialize(KEY_SIZE new SecureRandom())KeyPair keyPair = keyPairGen genKeyPair()return keyPair} catch (Exception e) {throw new EncryptException(e getMessage())}}/*** 生成公钥* @param modulus* @param publicExponent* @return RSAPublicKey* @throws EncryptException*/public static RSAPublicKey generateRSAPublicKey(byte[] modulus byte[] publicExponent) throws EncryptException {KeyFactory keyFac = nulltry {keyFac = KeyFactory getInstance( RSA new bouncycastle jce provider BouncyCastleProvider())} catch (NoSuchAlgorithmException ex) {throw new EncryptException(ex getMessage())}RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus) new BigInteger(publicExponent))try {return (RSAPublicKey) keyFac generatePublic(pubKeySpec)} catch (InvalidKeySpecException ex) {throw new EncryptException(ex getMessage())}}/*** 生成私钥* @param modulus* @param privateExponent* @return RSAPrivateKey* @throws EncryptException*/public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus byte[] privateExponent) throws EncryptException {KeyFactory keyFac = nulltry {keyFac = KeyFactory getInstance( RSA new bouncycastle jce provider BouncyCastleProvider())} catch (NoSuchAlgorithmException ex) {throw new EncryptException(ex getMessage())}RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus) new BigInteger(privateExponent))try {return (RSAPrivateKey) keyFac generatePrivate(priKeySpec)} catch (InvalidKeySpecException ex) {throw new EncryptException(ex getMessage())}}/*** 加密* @param key 加密的密钥* @param data 待加密的明文数据* @return 加密后的数据* @throws EncryptException*/public static byte[] encrypt(Key key byte[] data) throws EncryptException {try {Cipher cipher = Cipher getInstance( RSA new bouncycastle jce provider BouncyCastleProvider())cipher init(Cipher ENCRYPT_MODE key)int blockSize = cipher getBlockSize()//获得加密块大小 如 加密前数据为 个byte 而key_size= 加密块大小为 byte 加密后为 个byte因此共有 个加密块 第一个 byte第二个为 个byteint outputSize = cipher getOutputSize(data length)//获得加密块加密后块大小int leavedSize = data length % blockSizeint blocksSize = leavedSize != ? data length / blockSize + : data length / blockSizebyte[] raw = new byte[outputSize * blocksSize]int i = while (data length i * blockSize >) {if (data length i * blockSize >blockSize)cipher doFinal(data i * blockSize blockSize raw i * outputSize)elsecipher doFinal(data i * blockSize data length i * blockSize raw i * outputSize)//这里面doUpdate方法不可用 查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到ByteArrayOutputStream中 而最后doFinal的时候才将所有的byte[]进行加密 可是到了此时加密块大小很可能已经超出了OutputSize所以只好用dofinal方法 i++}return raw} catch (Exception e) {throw new EncryptException(e getMessage())}}/*** 解密* @param key 解密的密钥* @param raw 已经加密的数据* @return 解密后的明文* @throws EncryptException*/public static byte[] decrypt(Key key byte[] raw) throws EncryptException {try {Cipher cipher = Cipher getInstance( RSA new bouncycastle jce provider BouncyCastleProvider())cipher init(cipher DECRYPT_MODE key)int blockSize = cipher getBlockSize()ByteArrayOutputStream bout = new ByteArrayOutputStream( )int j = while (raw length j * blockSize >) {bout write(cipher doFinal(raw j * blockSize blockSize))j++}return bout toByteArray()} catch (Exception e) {throw new EncryptException(e getMessage())}}/**** @param args* @throws Exception*/public static void main(String[] args) throws Exception {File file = new File( l )FileInputStream in = new FileInputStream(file)ByteArrayOutputStream bout = new ByteArrayOutputStream()byte[] tmpbuf = new byte[ ]int count = while ((count = in read(tmpbuf)) != ) {bout write(tmpbuf count)tmpbuf = new byte[ ]}in close()byte[] Data = bout toByteArray()KeyPair keyPair = RSAUtil generateKeyPair()RSAPublicKey pubKey = (RSAPublicKey) keyPair getPublic()RSAPrivateKey priKey = (RSAPrivateKey) keyPair getPrivate()byte[] pubModBytes = pubKey getModulus() toByteArray()byte[] pubPubExpBytes = pubKey getPublicExponent() toByteArray()byte[] priModBytes = priKey getModulus() toByteArray()byte[] priPriExpBytes = priKey getPrivateExponent() toByteArray()RSAPublicKey recoveryPubKey = RSAUtil generateRSAPublicKey(pubModBytes pubPubExpBytes)RSAPrivateKey recoveryPriKey = RSAUtil generateRSAPrivateKey(priModBytes priPriExpBytes)byte[] raw = RSAUtil encrypt(priKey Data)file = new File( encrypt_result dat )OutputStream out = new FileOutputStream(file)out write(raw)out close()byte[] data = RSAUtil decrypt(recoveryPubKey raw)file = new File( l )out = new FileOutputStream(file)out write(data)out flush()out close()}}加密可以用公钥 解密用私钥 或者加密用私钥 通常非对称加密是非常消耗资源的 因此可以对大数据用对称加密如 des(具体代码可以看我以前发的贴子) 而对其对称密钥进行非对称加密 这样既保证了数据的安全 还能保证效率 lishixinzhi/Article/program/Java/gj/201311/27391

RSA算法很简单,就是基于欧拉定理的简单算法 M=5是明文,计算过程如下: n=p*q=33 (p-1)*(q-1)=20 加密:y=密文,x=明文=5 y=x^e mod n = 5^7 mod 33 = 14 解密: x=y^d mod n d*e= 1 [mod(p-1)*(q-1)] 7d=1(mod 20)所以d=3 所以x=y^d mod n= 14^3 mod 33 = 5解完 加密由5~14,解密由14~5,实现了RSA算法的加密解密过程,证明了计算的正确性。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11454301.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存