试图比较我的两个哈希值。两者都是大整数形式

时间:2014-07-28 18:08:22

标签: java cryptography

我试图比较两个值,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();
        }

    }
}

1 个答案:

答案 0 :(得分:2)

基本上要反转N中的模幂运算,您需要计算逆mod phi(N)。 (不是mod N)。

phi(N)Ngcd(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)
    }
}

您的密钥生成器只需要生成两个随机素数pq以及一个随机值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