gpt4 book ai didi

java - 迪菲·赫尔曼 key 交换

转载 作者:行者123 更新时间:2023-11-30 04:20:10 29 4
gpt4 key购买 nike

我目前正在尝试使用 java 加密库进行 diffie hellman key 交换,我已经成功找到了一个安全素数以及它的生成器。但是,我似乎无法使用我找到的值创建 DH key 。它给了我以下异常

线程“main”中出现异常 java.security.InvalidAlgorithmParameterException:素数大小必须是 64 的倍数,并且范围只能是 512 到 1024(含) 在 com.sun.crypto.provider.DHKeyPairGenerator.initialize(DHKeyPairGenerator.java:120) 在 java.security.KeyPairGenerator$Delegate.initialize(来源未知) 在 java.security.KeyPairGenerator.initialize(来源未知) 在 DH.createSpecificKey(DH.java:35) 在 DH.main(DH.java:166)

众所周知,在密码学中我们不能让素数很小。我如何满足我的安全素数和生成器的要求,以符合 DH 库的标准。

下面是我的源代码

public static void createKey()throws Exception
{
KeyPairGenerator kpg = KeyPairGenerator.getInstance("DiffieHellman");
kpg.initialize(512);
KeyPair kp = kpg.generateKeyPair();
KeyFactory kfactory = KeyFactory.getInstance("DiffieHellman");

DHPublicKeySpec kspec = (DHPublicKeySpec) kfactory.getKeySpec(kp.getPublic(), DHPublicKeySpec.class);

}

public static void createSpecificKey(BigInteger p,BigInteger g)throws Exception
{
KeyPairGenerator kpg = KeyPairGenerator.getInstance("DiffieHellman");
DHParameterSpec param = new DHParameterSpec(p,g);
kpg.initialize(param);

KeyPair kp = kpg.generateKeyPair();

KeyFactory kfactory = KeyFactory.getInstance("DiffieHellman");

DHPublicKeySpec kspec = (DHPublicKeySpec) kfactory.getKeySpec(kp.getPublic(), DHPublicKeySpec.class);

}


static boolean isPrime(long n)
{
if (n%2 == 0)
{
return false;
}

for(int i = 3 ; i*i<=n;i+=2)
{
if(n%i==0)
return false;
}
return true;
}


public static void main(String [] args) throws Exception
{

Random randomGenerator = new Random();

long pValue = randomGenerator.nextInt(1000000);
long gValue = randomGenerator.nextInt(100000);
long correctPValue;

boolean checkPrime = isPrime(pValue);
System.out.println("the number generated is "+pValue);
System.out.println(checkPrime);

while(checkPrime == false)

{
long pValue2 = randomGenerator.nextInt(1000000);
boolean checkPrimeInLoop = isPrime(pValue2);
//System.out.println("value in loop is "+pValue2);
if(checkPrimeInLoop == true)
{
pValue=pValue2;
break;
}
}


long checkSP = (pValue*2)+1;
boolean checkSafePrime = isPrime(checkSP);
//System.out.println(checkSafePrime);
while(checkSafePrime==false)
{
long pValue3=randomGenerator.nextInt(1000000);
boolean checkPrimeInLoop = isPrime(pValue3);
long pValue5=(pValue3*2)+1;
//boolean checkSafePrimeInLoop = isPrime(pValue4);
boolean checkSafePrime2InLoop = isPrime(pValue5);

if(checkSafePrime2InLoop == true && checkPrimeInLoop == true)
{
pValue=pValue3;
break;
}

}

System.out.println("the safe prime is"+pValue);//safe prime

while(gValue>pValue)
{
long gValue2=randomGenerator.nextInt(100000);

if(gValue2<pValue)
{
gValue=gValue2;
break;
}
}

long getDivisor = (pValue-1)/2;
BigInteger bi1,bi2,bi3,bi4;

bi1=BigInteger.valueOf(getDivisor);

bi2 = BigInteger.valueOf(pValue);

bi3 = BigInteger.valueOf(gValue);

bi4= bi3.modPow(bi1,bi2);

long calculatedValue = bi4.longValue();


while(calculatedValue == 1)
{
long gValue3=randomGenerator.nextInt(100000);
long getDivisorInLoop = (pValue-1)/2;
BigInteger bi5,bi6,bi7,bi8;

bi5=BigInteger.valueOf(getDivisorInLoop);

bi6 = BigInteger.valueOf(pValue);

bi7 = BigInteger.valueOf(gValue3);

bi8= bi7.modPow(bi5,bi6);

long calculatedValueInLoop = bi8.longValue();
System.out.println(calculatedValueInLoop);
if(calculatedValueInLoop!=1)
{
gValue=gValue3;
break;
}
}

BigInteger generatorValue,primeValue;

generatorValue = BigInteger.valueOf(gValue);
primeValue = BigInteger.valueOf(pValue);

createKey();

int bitLength=512;

createSpecificKey(generatorValue,primeValue);


}

希望大家能帮我解决这个问题。提前致谢!

最佳答案

您的目标是 512 位长度:kpg.initialize(512);

您可以像这样生成这样长度的 p 和 g:

int bitLength = 1024;
SecureRandom rnd = new SecureRandom();
BigInteger p = BigInteger.probablePrime(bitLength, rnd);
BigInteger g = BigInteger.probablePrime(bitLength, rnd);

probablePrime 可能使用 Rabin-Miller 或 Solovay-Strassen 测试,该测试仅给出 2^-100 的机会(实际上没有机会)结果整数不是素数。自 2002 年以来,出现了一种称为 AKS(Agrawal–Kayal–Saxena)的多项式时间算法,用于 100% 确定性地测试素数(但到目前为止我还没有看到它被使用,可能 2^-100 对任何人都有好处)。

关于java - 迪菲·赫尔曼 key 交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17248095/

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