如何使用BigInteger加密字符串?

时间:2018-04-15 01:21:26

标签: java encryption rsa biginteger

我正在尝试使用字母数字字符串并使用大整数对其进行加密。当我使用十进制值(例如10)初始化BigInteger时,我的加密和解密工作。但是当我使用字符串初始化BigInteger时,解密不会返回原始的BigInteger。 这是我用来生成密钥和加密/解密的代码。

public static void main(String args[]) {
    int keySize = 32;

    BigInteger prime1 = new BigInteger(keySize / 2, 100, new SecureRandom());
    BigInteger prime2 = new BigInteger(keySize / 2, 100, new SecureRandom());

    BigInteger n = prime1.multiply(prime2); 
    BigInteger totient = prime1.subtract(BigInteger.ONE).multiply(prime2.subtract(BigInteger.ONE));

    //create the private key
    BigInteger e;
    do e = new BigInteger(totient.bitLength(), new SecureRandom());
    while (e.compareTo(BigInteger.ONE) <= 0 || e.compareTo(totient) >= 0 || !e.gcd(totient).equals(BigInteger.ONE));

    //create public key
    BigInteger d = e.modInverse(totient);


    String original = "Hello World!";

    BigInteger enc = new BigInteger(original.getBytes());
    System.out.println("Original: " + enc.toString());

    //encrypt
    enc = enc.modPow(e, n);

    //decrypt
    BigInteger dec = enc;
    dec = dec.modPow(d, n);
    System.out.println("Result: " + dec.toString());
}

正如我所说,如果我将enc初始化为整数值,比如10,我的结果将是...

Original: 10
Result: 10

然而,当我初始化为字符串时,就像上面的代码一样,我的结果就像这样......

Original: 22405534230753928650781647905
Result: 1828948854

我是否实施了加密错误,或者在将字符串转换为BigInteger加密时是否缺少某些内容?

1 个答案:

答案 0 :(得分:3)

  

我是否实施了加密错误

看起来您正在使用32位keySize实现RSA。这也将消息的大小限制为32位;您尝试加密的邮件远远大于此。