gpt4 book ai didi

java - 为给定的模数和指数生成 RSA key

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:58:47 24 4
gpt4 key购买 nike

我被要求使用给定的 modulusexponent 值生成 RSA key 。但我只知道如何在不指定模数和指数的情况下生成 key 。无论我给出什么值,似乎都是大整数值。我在网上搜索了这个并解决了一些问题,但它无法成功。

所以如果有人以前这样做过,他们能给我一些提示吗?

这是我们用给定值尝试过的示例程序。

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAKeyGenParameterSpec;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;

public class Sample {
public static void main( String args[] ) {

BigInteger modulus = new BigInteger("350871044328208704010580786055405681");
BigInteger exponent = new BigInteger("545161406957801571");

try {
RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, exponent);
RSAPrivateKeySpec privateSpec = new RSAPrivateKeySpec(modulus, exponent);

KeyFactory factory = KeyFactory.getInstance("RSA");

PublicKey pub = factory.generatePublic(spec);
PrivateKey priv = factory.generatePrivate(privateSpec);

System.out.println("Public Key : "+ byteArrayToHexString( pub.getEncoded() ));
System.out.println("Private Key : "+ byteArrayToHexString( priv.getEncoded() ));
}
catch( Exception e ) {
System.out.println(e.toString());
}
}
public static String byteArrayToHexString(byte[] bytes)
{
StringBuffer buffer = new StringBuffer();
for(int i=0; i<bytes.length; i++)
{
if(((int)bytes[i] & 0xff) < 0x10)
buffer.append("0");
buffer.append(Long.toString((int) bytes[i] & 0xff, 16));
}
return buffer.toString();
}
}

错误:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: RSA keys must be at least 512 bits long

最佳答案

我给你一些关于 RSA 的信息。首先在 RSA key 中 modulus = p·q 其中 pq 是不同的质数,模数长度是 key 长度。因此,当您收到异常时:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: RSA keys must be at least 512 bits long

这意味着您的模数至少必须为 512 位长。

除了您的代码中还有另一个错误,您对公钥和私钥使用了相同的指数,但这些指数必须是不同的数字。

在简历中,您必须按照 RSA key 生成算法使用 java.math.BigInteger 计算模数、公共(public)指数和私有(private)指数,以生成正确的 key 。我从你的代码中给你一个例子:

import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;

public class Sample {
public static void main( String args[] ) {

int keySize = 512;
SecureRandom random = new SecureRandom();
// Choose two distinct prime numbers p and q.
BigInteger p = BigInteger.probablePrime(keySize/2,random);
BigInteger q = BigInteger.probablePrime(keySize/2,random);
// Compute n = pq (modulus)
BigInteger modulus = p.multiply(q);
// Compute φ(n) = φ(p)φ(q) = (p − 1)(q − 1) = n - (p + q -1), where φ is Euler's totient function.
// and choose an integer e such that 1 < e < φ(n) and gcd(e, φ(n)) = 1; i.e., e and φ(n) are coprime.
BigInteger m = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
BigInteger publicExponent = getCoprime(m,random);
// Determine d as d ≡ e−1 (mod φ(n)); i.e., d is the multiplicative inverse of e (modulo φ(n)).
BigInteger privateExponent = publicExponent.modInverse(m);


try {
RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, publicExponent);
RSAPrivateKeySpec privateSpec = new RSAPrivateKeySpec(modulus, privateExponent);

KeyFactory factory = KeyFactory.getInstance("RSA");

PublicKey pub = factory.generatePublic(spec);
PrivateKey priv = factory.generatePrivate(privateSpec);

System.out.println("Public Key : "+ byteArrayToHexString( pub.getEncoded() ));
System.out.println("Private Key : "+ byteArrayToHexString( priv.getEncoded() ));
}
catch( Exception e ) {
System.out.println(e.toString());
}
}

public static BigInteger getCoprime(BigInteger m, SecureRandom random) {
int length = m.bitLength()-1;
BigInteger e = BigInteger.probablePrime(length,random);
while (! (m.gcd(e)).equals(BigInteger.ONE) ) {
e = BigInteger.probablePrime(length,random);
}
return e;
}


public static String byteArrayToHexString(byte[] bytes)
{
StringBuffer buffer = new StringBuffer();
for(int i=0; i<bytes.length; i++)
{
if(((int)bytes[i] & 0xff) < 0x10)
buffer.append("0");
buffer.append(Long.toString((int) bytes[i] & 0xff, 16));
}
return buffer.toString();
}
}

希望对您有所帮助,

关于java - 为给定的模数和指数生成 RSA key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24546397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com