【发布时间】:2018-02-26 23:00:23
【问题描述】:
我正在尝试使用存储在文件中的公钥进行加密/解密。代码如下:
encryptWithKey (toEncrypt, publicKeyPath) {
var publicKey = fs.readFileSync(publicKeyPath, "utf8");
var buffer = new Buffer(toEncrypt, 'utf8');
var encrypted = crypto.publicEncrypt(publicKey, buffer);
return encrypted.toString("base64"); //converting it to base64 string
},
decryptWithKey (toDecrypt, publicKeyPath) {
var publicKey = fs.readFileSync(publicKeyPath, "utf8");
var b = new Buffer(toDecrypt, 'base64') // converting back to normal string from base 64 string
var decrypted = crypto.publicDecrypt(publicKey, b);
return decrypted.toString('utf8');
},
我的理解是,我首先将密钥读入字符串,使用带有 UTF8 编码的缓冲区,并使用公共加密方法加密我的文本。现在,当我尝试使用解密方法解密相同的加密文本时,我得到了错误
RSA_padding_check_PKCS1_type_1:块类型不是01
我认为我的公钥存在一些填充问题?但我对两者都使用相同的公钥。在 Crypto.js 中,我在 publicDecrypt Method 下阅读了这个:
publicKey 可以是对象或字符串。如果 publicKey 是一个字符串,它 被视为没有密码的密钥,将使用 RSA_PKCS1_PADDING。
而且,这在 publicEncrypt 方法下:
publicKey 可以是对象或字符串。如果 publicKey 是一个字符串,它 被视为没有密码的密钥,将使用 RSA_PKCS1_OAEP_PADDING。
现在,我需要使用公钥作为字符串,加密和解密的定义指定这些方法使用的默认填充是不同的。那么我该怎么做才能接受相同的填充?
【问题讨论】:
-
你不能用公钥解密,只有私钥可以解密......这就是使用这些类型的密钥的全部目的。 techopedia.com/definition/9021/public-key-cryptography-pkc
-
好的,这是否意味着我需要从这个公钥创建一个私钥来解密?
-
情况正好相反。使用创建该公钥的私钥,或者使用您的私钥创建一个新的公钥...
-
在旁注中,文档指出私钥可以用作公钥,但不能相反。仅仅因为公钥是由私钥制成的。
-
好的,感谢您的帮助。我将继续我的研究。此公钥由第 3 方 API 提供商提供,因此我将无法使用他们的密钥解密我的文本。我将需要创建自己的然后进行测试。谢谢!但是,如果无法使用公钥解密,那么为什么要使用这种方法呢? nodejs.org/api/…
标签: javascript node.js encryption