我正在尝试实现一个变异加密算法(理论上由我开发),作为要求的一部分,我需要生成一个 RSA key 对并将其存储在数据库中,以便稍后可以检索它作为加密过程(仅用于加密 session key ,以便它可以与加密消息一起安全发送)。
我尝试生成 RSA key 对似乎有效,但它会一遍又一遍地生成相同的值,而不是每次运行代码时都提供新的 key 对。我做错什么了? 此外,如果这些值取决于机器本身(因此显示相同的值),是否有一种方法可以将 key 对生成链接到提供的电子邮件地址,以便每次输入新电子邮件地址时都会输出不同的 RSA key 对?
以下代码是我尝试生成 key 对:
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);
}
}
谢谢
最佳答案
那么,你的第一个问题是:
keyGen.genKeyPair().getPublic().getEncoded();
keyGen.genKeyPair().getPrivate().getEncoded();
您没有保存 key 对,因此您生成的公钥和私钥不匹配。在 javadocs 中,genKeyPair()
的行为如下:
This will generate a new key pair every time it is called.
其次,getEncoded() 只是将 key 作为字节数组返回。如果您的数据库可以存储二进制值,就以这种方式存储它。否则,您可能会以某种方式将它转换为 String 的运气要好得多。例如,您可以使用这个巧妙的小技巧对其进行 base 64 编码(可能比您正在做的更可靠):
String keyAsString = new BigInteger(publicKey.getEncoded()).toString(64);
您随后可以通过以下方式取回原始字节:
byte[] bytes = new BigInteger(keyAsString, 64).toByteArray();
你说你每次运行都得到相同的值(并在为此烦恼之前确保你是),我不是 100% 确定为什么。您应该能够访问算法参数(您可能必须将 key 转换为不同的类型),尝试打印这些参数以查看它们是否相同。有人提到检查您的随机数生成器,这可能也是个好主意。
关于java - 如何创建 RSA key 对以便将其存储在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11939992/