如何创建RSA密钥对以便将其存储在数据库中?

时间:2012-08-13 18:17:14

标签: java rsa

我正在尝试实现变异加密算法(理论上由我开发),并且作为需求的一部分,我需要生成一个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); 
    }
}

感谢

1 个答案:

答案 0 :(得分:5)

嗯,你的第一个问题是:

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

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

  

每次调用它时都会生成一个新的密钥对。

其次,getEncoded()只是将键作为字节数组返回。如果您的数据库可以存储二进制值,只需将其存储即可。否则,你可能会有更好的运气将它转换为String。例如,您可以使用这个简洁的小技巧对64进行编码(可能比您正在做的更可靠):

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

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

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

你说你每次跑步都得到相同的价值(并且在打扰之前确定你是这样),而且我不是百分之百确定原因。您应该能够访问算法参数(您可能必须将密钥转换为其他类型),尝试打印它们以查看它们是否相同。有人提到检查随机数生成器,这也许是一个好主意。