我试图比较两个值,hcB已被哈希,然后对值进行取幂,而hci正在执行exp值的倒数。然后比较。它们应该是平等的但不是。
public class Hash
{
static MessageDigest sha1;
private static final int unitLength = 160; // SHA-1 has 160-bit output.
public static void main(String[] args)throws Exception
{
String s = new String("hello");
BigInteger b =new BigInteger(s.getBytes()); // Big integer conversion
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
sha1.reset();
sha1.update(s.getBytes());
byte[] hc = sha1.digest();
BigInteger hcB=new BigInteger(1,hc);
KeyGenerator keyRC=new KeyGenerator();
try {
keyRC.initialize();//generating key
BigInteger HashClValueExp=hcB.modPow(keyRC.RC, keyRC.p);// exponentiate of hashed value
System.out.println("HasheCldExp Value: "+HashClValueExp);
//Inverse RC
BigInteger inv = keyRC.RC.modInverse(keyRC.q);
System.out.println("Inverse RC: " + inv);
// Hash value inverse computation
BigInteger hci = HashClValueExp.modPow(inv, keyRC.p);
System.out.println("hci: " + hci); // prints in hex
System.out.println("hcB: " + hcB);
System.out.println("Compare hci and hcB :" + hci.compareTo(hcB));
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
基本上要反转N
中的模幂运算,您需要计算逆mod phi(N)
。 (不是mod N
)。
phi(N)
是N
中gcd(x, N) = 1
的元素数量(换句话说,它们不共享任何素因子)。
如果你不知道N
的所有素因子,就很难计算出这个函数的价值
因素N
也不能有效地完成(据我们所知)
这实际上是 RSA -crypto-system的安全性所依赖的属性。
因此,要使代码正常工作,您需要使用密钥生成器生成一组非常具体的值(我的示例显示了 RSA 加密):
class RSAKey {
private final BigInteger p, q, e; // p and q must be distinct primes
public RSAKey(BigInteger p, BigInteger q, BigInteger e) {
this.p = p; this.q = q; this.e = e;
}
public BigInteger getN() { return p.multiply(q) } // return N
public BigInteger getE() { return e }; // return e
public BigInteger getPhiN() { // return phi(N)
return p.subtract(new BigInteger("1").multiply(q.subtract(new BigInteger("1")); // (p-1) * (q-1)
}
}
您的密钥生成器只需要生成两个随机素数p
和q
以及一个随机值e
并将它们传递给上面的类。
编码模幂运算然后反转,然后查看以下内容:
RSAKey key = keyGen.generateKey();
/*
* compute the decryption exponent d as:
* d = e^-1 mod phi(N)
*/
BigInteger d = key.getE().modInverse(key.getPhiN());
BigInteger c = m.modPow(e, N); // encrypt message m to ciphertext c
BigInteger m1 = c.modPow(d, N); // decrypt ciphertext c to message m1
System.out.println(m.equals(m1)); // the messages should be equal now
注意:您自己实施RSA应仅用于教育目的!如果您想将RSA加密用于其他任何事情, 你应该使用Java Cipher -class和Java KeyGenerator !