Java 如何生成一个随机数,这是Zn(部分盲签名程序)的一个元素

Java 如何生成一个随机数,这是Zn(部分盲签名程序)的一个元素,java,encryption,random,rsa,digital-signature,Java,Encryption,Random,Rsa,Digital Signature,我正试图从一个实例用Java实现一个部分盲签名方案。在等式(1)中,需要生成两个随机元素r和u,它们必须是Zn的元素 r,u∈ 锌 这是在RSA方案中,其中模n=p.q 我不完全确定如何实现这一点——我是否只需要生成一个不可被p或q整除的随机数?我假设这可以使用bigingergcd来完成,但我不确定这是否正确 到目前为止,我生成的参数如下(其中e是biginger的值为3): 我不相信φ的值与这个问题有关,它只是我生成RSA参数的一部分 理想情况下,有一个库可以为我处理所述生成的r,u,但我没

我正试图从一个实例用Java实现一个部分盲签名方案。在等式(1)中,需要生成两个随机元素
r
u
,它们必须是
Zn
的元素

r,u∈ 锌

这是在RSA方案中,其中模
n=p.q

我不完全确定如何实现这一点——我是否只需要生成一个不可被
p
q
整除的随机数?我假设这可以使用
biginger
gcd
来完成,但我不确定这是否正确

到目前为止,我生成的参数如下(其中
e
biginger
的值为3):

我不相信φ的值与这个问题有关,它只是我生成RSA参数的一部分


理想情况下,有一个库可以为我处理所述生成的
r,u
,但我没有找到任何库。

设计一个简单快速的算法来生成
Zn
的随机元素是相当容易的:

public BigInteger getBiasedRandomModN(BigInteger n) {
    BigInteger r = new BigInteger(n.bitLength(), new SecureRandom());
    return r.mod(n);
}
这段代码的问题是它有偏见
BigInteger
仅允许我们根据位长度生成随机数。如果我们仅基于略小于
n
的值生成
r
,则无法达到
Zn
的某些值。如果我们简单地使用
n
的所有位,但使用mod(如代码所示),则
r
的低值将更频繁地出现

解决这个问题的方法是经常生成
r
,直到它出现在
n
的范围内:

public BigInteger getRandomModN(BigInteger n) {
    SecureRandom rnd = new SecureRandom();
    BigInteger r;
    do {
        r = new BigInteger(n.bitLength(), rnd);
    } while (r.compareTo(n) >= 0);
    return r;
}

请记住,如果
n
的幂略高于2,则此代码可能会运行很长时间。最好以某种方式选择
p
q
,这样就不会发生这种情况。

设计一种简单快速的算法来生成
Zn
的随机元素是相当容易的:

public BigInteger getBiasedRandomModN(BigInteger n) {
    BigInteger r = new BigInteger(n.bitLength(), new SecureRandom());
    return r.mod(n);
}
这段代码的问题是它有偏见
BigInteger
仅允许我们根据位长度生成随机数。如果我们仅基于略小于
n
的值生成
r
,则无法达到
Zn
的某些值。如果我们简单地使用
n
的所有位,但使用mod(如代码所示),则
r
的低值将更频繁地出现

解决这个问题的方法是经常生成
r
,直到它出现在
n
的范围内:

public BigInteger getRandomModN(BigInteger n) {
    SecureRandom rnd = new SecureRandom();
    BigInteger r;
    do {
        r = new BigInteger(n.bitLength(), rnd);
    } while (r.compareTo(n) >= 0);
    return r;
}

请记住,如果
n
的幂略高于2,则此代码可能会运行很长时间。最好以某种方式选择
p
q
,以免出现这种情况。

在问题中定义术语。您的问题应该是独立的,人们不必通过外部链接来了解您的问题。@pjs我已经添加了更多信息,我认为这应该会有所帮助。我怀疑您想要类似的东西。我已经几十年没有研究过这些东西了,所以我给你一个指针而不是答案。在问题中定义你的术语。您的问题应该是独立的,人们不必通过外部链接来了解您的问题。@pjs我已经添加了更多信息,我认为这应该会有所帮助。我怀疑您想要类似的东西。我已经几十年没有研究过这个东西了,所以我给你一个指针而不是答案。这段代码可能包含一个关于
位长度
vs
位计数
的off-by-one错误。我还没有测试它。这段代码可能包含一个关于
位长度
位计数
的off-by-one错误。我还没有测试过。