rsa算法实现代码

rsa算法实现代码,第1张

你看看这个行不行,位数可以自己改,今天在网上找到了,我也想用C生成512、1024位的大素数进行RSA加密。。如果谁有好方法麻烦共享下:76287324@qq.com,跪谢

package test

import java.math.BigInteger

// 生成一个随机大整数,然后找出比这个整数大的下一个素数

public class Primes {

// 下面的 BigInteger.ZERO 和 BigInteger.ONE 在 JDK 1.1 中是无效的

private static final BigInteger ZERO = BigInteger.ZERO

private static final BigInteger ONE = BigInteger.ONE

private static final BigInteger TWO = new BigInteger("2")

// 产生一个错误素数的概率小于 1/2 的 ERR_VAL 次方,可以将 ERR_VAL 定义为 200,降低其错误率

// Java 应该使用的是 Miller-Rabin 测试法,这种错误概率基本上可以认为是无错误。

private static final int ERR_VAL = 100

private static StringBuffer[] digits = { new StringBuffer("0"), new StringBuffer("1"), new StringBuffer("2"), new StringBuffer("3"), new StringBuffer("4"), new StringBuffer("5"),

new StringBuffer("6"), new StringBuffer("7"差虚), new StringBuffer("8"), new StringBuffer("9") }

private static StringBuffer randomDigit(boolean isZeroOK) {

// 产生一个随机的数字(字符串形式的),isZeroOK 决定这个数字是否可以为 0

int index

if (isZeroOK)

index = (int) Math.floor(Math.random() * 10)

else

index = 1 + (int) Math.floor(Math.random() * 9)

return (digits[index])

}

public static BigInteger bigRandom(int numDigits) {

// 产生一个随机大整数,各位上的数字都是随机产生的,首位不为 0

StringBuffer s = new StringBuffer("")

for (int i = 0i <numDigitsi++)

if (i == 0)

s.append(randomDigit(false))

else

s.append(randomDigit(true))

return (new BigInteger(s.toString()))

}

private static boolean isEven(BigInteger n) {

//基闹 测试一个大整数是否为偶数虚锋燃

return (n.mod(TWO).equals(ZERO))

}

public static BigInteger nextPrime(BigInteger start) {

// 产生一个比给定大整数 start 大的素数,错误率低于 1/2 的 ERR_VAL 次方

if (isEven(start))

start = start.add(ONE)

else

start = start.add(TWO)

if (start.isProbablePrime(ERR_VAL))

return (start)

else

// 采用递归方式(递归的层数会是个天文数字吗?)

return (nextPrime(start))

}

// 一个基于命令行的测试程序,如果位数错误,默认 150 位,输出 20 个素数

public static void main(String[] args) {

int numDigits

try {

numDigits = Integer.parseInt(args[0])

} catch (Exception e) {

numDigits = 128

}

BigInteger start = bigRandom(numDigits)

start = nextPrime(start)

BigInteger end = bigRandom(5)

end = nextPrime(end)

System.out.println("大素数" + start)

System.out.println("大素数" + end)

BigInteger result = start.multiply(end)

System.out.println("结果数" + result)

鉴于rsa加密的重要性和相关源代码的匮乏 经过整理特此贴出 需要下载bcprov jdk jar import javax crypto Cipherimport java security *import java security spec RSAPublicKeySpec清纳import 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


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

原文地址:https://54852.com/yw/12410217.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存