📄 dsaparametersgenerator.java
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: DSAParametersGenerator.java
package org.bouncycastle.crypto.generators;
import java.math.BigInteger;
import java.security.SecureRandom;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.params.DSAParameters;
import org.bouncycastle.crypto.params.DSAValidationParameters;
public class DSAParametersGenerator
{
private int size;
private int certainty;
private SecureRandom random;
private static BigInteger ONE = BigInteger.valueOf(1L);
private static BigInteger TWO = BigInteger.valueOf(2L);
public DSAParametersGenerator()
{
}
public void init(int size, int certainty, SecureRandom random)
{
this.size = size;
this.certainty = certainty;
this.random = random;
}
private void add(byte a[], byte b[], int value)
{
int x = (b[b.length - 1] & 0xff) + value;
a[b.length - 1] = (byte)x;
x >>>= 8;
for (int i = b.length - 2; i >= 0; i--)
{
x += b[i] & 0xff;
a[i] = (byte)x;
x >>>= 8;
}
}
public DSAParameters generateParameters()
{
byte seed[] = new byte[20];
byte part1[] = new byte[20];
byte part2[] = new byte[20];
byte u[] = new byte[20];
SHA1Digest sha1 = new SHA1Digest();
int n = (size - 1) / 160;
byte w[] = new byte[size / 8];
BigInteger q = null;
BigInteger p = null;
BigInteger g = null;
int counter = 0;
boolean primesFound = false;
label0:
do
{
if (!primesFound)
{
do
{
random.nextBytes(seed);
sha1.update(seed, 0, seed.length);
sha1.doFinal(part1, 0);
System.arraycopy(seed, 0, part2, 0, seed.length);
add(part2, seed, 1);
sha1.update(part2, 0, part2.length);
sha1.doFinal(part2, 0);
for (int i = 0; i != u.length; i++)
u[i] = (byte)(part1[i] ^ part2[i]);
u[0] |= 0x80;
u[19] |= 1;
q = new BigInteger(1, u);
} while (!q.isProbablePrime(certainty));
counter = 0;
int offset = 2;
do
{
if (counter >= 4096)
continue label0;
for (int k = 0; k < n; k++)
{
add(part1, seed, offset + k);
sha1.update(part1, 0, part1.length);
sha1.doFinal(part1, 0);
System.arraycopy(part1, 0, w, w.length - (k + 1) * part1.length, part1.length);
}
add(part1, seed, offset + n);
sha1.update(part1, 0, part1.length);
sha1.doFinal(part1, 0);
System.arraycopy(part1, part1.length - (w.length - n * part1.length), w, 0, w.length - n * part1.length);
w[0] |= 0x80;
BigInteger x = new BigInteger(1, w);
BigInteger c = x.mod(q.multiply(TWO));
p = x.subtract(c.subtract(ONE));
if (p.testBit(size - 1) && p.isProbablePrime(certainty))
{
primesFound = true;
continue label0;
}
counter++;
offset += n + 1;
} while (true);
}
BigInteger pMinusOneOverQ = p.subtract(ONE).divide(q);
do
{
BigInteger h;
do
h = new BigInteger(size, random);
while (h.compareTo(ONE) <= 0 || h.compareTo(p.subtract(ONE)) >= 0);
g = h.modPow(pMinusOneOverQ, p);
} while (g.compareTo(ONE) <= 0);
return new DSAParameters(p, q, g, new DSAValidationParameters(seed, counter));
} while (true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -