4

我正在尝试实现一个变异加密算法(理论上由我开发),作为要求的一部分,我需要生成一个 RSA 密钥对并将其存储在数据库中,以便以后可以在加密过程中检索它(仅用于加密会话密钥,以便它可以与加密消息一起安全发送)。

我尝试生成 RSA 密钥对似乎可行,但是它会一遍又一遍地生成相同的值,而不是每次运行代码时都提供新的密钥对。我做错什么了?此外,如果这些值取决于机器本身(因此显示相同的值),是否有办法将密钥对生成链接到提供的电子邮件地址,以便每次输入新的电子邮件地址时都会输出不同的 RSA 密钥对?

以下代码是我尝试生成密钥对:

import java.security.*;
import java.security.*;
/**
 * @author Speedy gonzales
 */
public class test {

    public static void main(String[] args) throws NoSuchAlgorithmException,        NoSuchProviderException {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(1024);

        byte[] publicKey = keyGen.genKeyPair().getPublic().getEncoded();
        StringBuffer retString1 = new StringBuffer();
        retString1.append("[");

        for (int puk = 0; puk < publicKey.length; ++puk) {
            retString1.append(publicKey[puk]);
           // retString1.append(", ");
        }
        retString1 = retString1.delete(retString1.length()-2,retString1.length());
        retString1.append("]");
        System.out.println(retString1);

          byte[] privateKey = keyGen.genKeyPair().getPrivate().getEncoded();
        StringBuffer retString2 = new StringBuffer();
        retString2.append("[");

        for (int pri = 0; pri < privateKey.length; ++pri) {
            retString2.append(privateKey[pri]);
           // retString2.append(", ");
        }
        retString2 = retString2.delete(retString2.length()-2,retString2.length());
        retString2.append("]");
        System.out.println(retString2); 
    }
}

谢谢

4

1 回答 1

5

那么,你的第一个问题是:

keyGen.genKeyPair().getPublic().getEncoded();
keyGen.genKeyPair().getPrivate().getEncoded();

您没有保存密钥对,因此您正在生成不匹配的公钥和私钥。从 javadocs 中,genKeyPair()行为如下:

这将在每次调用时生成一个新的密钥对。

其次, getEncoded() 只是将键作为字节数组返回。如果您的数据库可以存储二进制值,那么就以这种方式存储它。否则,您可能会有更好的运气以某种方式将其转换为字符串。例如,您可以使用这个巧妙的小技巧对它进行 base 64 编码(可能比您正在做的更可靠):

String keyAsString = new BigInteger(publicKey.getEncoded()).toString(64);

您随后可以通过以下方式取回原始字节:

byte[] bytes = new BigInteger(keyAsString, 64).toByteArray();

你说你每次运行都得到相同的值(并确保你在为此烦恼之前),我不是 100% 确定为什么。您应该能够访问算法参数(您可能必须将密钥转换为不同的类型),尝试打印它们以查看它们是否相同。有人提到检查您的随机数生成器,这也可能是个好主意。

于 2012-08-13T18:35:51.630 回答