Node.js使用Java创建加密密钥
我在node.js中有这段代码,它使用加密创建密钥。 我可以使用Java创建相同的密钥吗Node.js使用Java创建加密密钥,java,node.js,cryptography,diffie-hellman,Java,Node.js,Cryptography,Diffie Hellman,我在node.js中有这段代码,它使用加密创建密钥。 我可以使用Java创建相同的密钥吗 diffieHellmanConfig':{ '组':'modp14', '编码“:“base64” } const clientDHInstance=crypto.getDiffieHellman(config.userCardCrypto.diffieHellmanConfig.group); clientDHInstance.generateKeys(); const
diffieHellmanConfig':{
'组':'modp14',
'编码“:“base64”
}
const clientDHInstance=crypto.getDiffieHellman(config.userCardCrypto.diffieHellmanConfig.group);
clientDHInstance.generateKeys();
const clientPublicKey=clientDHInstance.getPublicKey(config.userCardCrypto.diffieHellmanConfig.encoding);
我试着用
KeyPairGenerator-keyGen=KeyPairGenerator.getInstance(“DH”);
密钥初始化(2048);
KeyPair KeyPair=keyGen.genKeyPair();
PrivateKey PrivateKey=keypair.getPrivate();
PublicKey PublicKey=keypair.getPublic();
byte[]encoded=publicKey.getEncoded();
字符串s=Base64.getEncoder().encodeToString(已编码);
系统输出打印项次;
但关键是错的
节点键是
(2)这个词的意思是一个单词。2)这个词的意思是一个单词的意思意思是:一个单词的意思意思是:一个单词的意思是一个关于某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某27/5TQLFALALLVZG==
Java密钥是
据英国《国家科学技术研究院(英国国家科学技术研究院(英国国家科学技术研究院(英国国家科学技术研究院(英国国家科学技术研究院(英国国家科学技术研究院(英国国家科学研究院)准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准/aVWBcYOZVJfOqVauUV0(2)参考资料,这一发现发现发现了一个vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv6)vvvvv6)vvvvvvvvvyyyyyyvvvvvvvvv1)参考参考参考参考文献[[[[[[[[[[7]vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv1/////[7]参考参考参考[[[7]参考参考参考参考[7]vvvvvvvvvvvvv1///////////////////7/7/7/7/7/7/7/7/7/7/7/7/7/7/7/7/7/7/7/7/FQV6Y10HW8KVOD88/mh09pdz+HxxDz+mVSMe+3+n7viyuegrghhravjbxmwh5zycmijii=在您的示例键中,节点创建的DH键在大小上是预期的
2048
位,但是,Java DH键正在推入~code>4k位
因此,我认为在Java上初始化DH键的方式有问题
查看您的代码,我认为不适合提供整数文本来指定DH循环组的大小
相反,请尝试像下面这样实例化Java DH密钥:
final DHParameterSpec keySpec=new DHParameterSpec(DH_MODULUS,DH_BASE);
final KeyPair keyPair;
try {
KeyPairGenerator keyGen=KeyPairGenerator.getInstance("DH");
keyGen.initialize(keySpec);
keyPair=keyGen.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
byte[] encoded = publicKey.getEncoded();
String s = Base64.getEncoder().encodeToString(encoded);
System.out.println(s);
}
您需要在Java中创建一个DHParameterSpec
对象,提供一个模数和基数,类似于node中提供的值
例如:
public DHParameterSpec modp14() {
final BigInteger p =
new BigInteger(
"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
+ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
+ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
+ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
+ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
+ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
+ "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
+ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
+ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
+ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
+ "15728E5A8AACAA68FFFFFFFFFFFFFFFF",
16);
final BigInteger g = new BigInteger("2");
return new DHParameterSpec(p, g);
}
请参阅素数组的规格。密钥有什么问题?当您说“相同”密钥时,您的意思是相同的大小,对吗?或者您实际上想要生成相同的密钥实例?即,当您调用genKeyPair()或generateKeys()时,实际上是相同的密钥字节当然,根据定义,您将获得不同的密钥材料。@Woodstock Java密钥比node大,而且当我尝试将其发送到服务器时,得到响应{“code”:500,“message”:“提供的密钥太大”}你能提供两个示例键吗,一个来自node,一个来自Java,这样我就可以看一下格式了吗?@Woodstock update questionOk,我想我知道了,我会写下答案谢谢你,但是我如何才能找到中提供的值node@MichaelSych节点使用的素数实际上始终是FFFFFFFFFFFF C90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B0A6DF25F14374FE1356D6D51C245E485B57665E7EC6F44C42E9A637ED6BFF5CB6F406B7EDE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55A29A66FA8CF5CF5F83655D23DCA3AD9662CF6F35620855BBB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5E6492929286868E498E498E41786CF8E41788E498E418CF8CF8E498E498E418E418FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFF,基数为2。我更新了我的代码以反映您的原始意图@MichaelSych,如果这对您有效,请将问题标记为已回答。Java密钥为2048位(和公共),但其格式为X.509 SubjectPublicKeyInfo,如javadoc for Key中所指定,其中包含参数(p和g)以及实际密钥(y)加上一些开销,使表示总共557字节。至少目前Java确实使用组14参数来表示size=2048,但这并不能保证,而且自己指定它们确实更好。@MichaelSych:“始终相同”的初始部分是外部TLV和X.509算法ID,其中包含OID和参数,应该是be相同。@MichaelSych+如果您只需要y值,请使用
((DHPublicKey)publicKey).getY().toByteArray()
,如果需要,请将结果修剪(或在极少数情况下填充)为256字节。并根据需要转换为base64。