我是密码学的初学者,请多多包涵。我想在包括EBC模式的情况下使用RSA加密,我已经四处搜寻,并在JavaScript中找到了一个名为JsEncrypt的库,该库通过密钥生成来执行RSA加密,但是文档中没有关于填充所使用的密码模式的内容。我正在做React Native项目,我从安全的第三方API请求公钥。我要做的就是使用RSA加密已使用第三方提供的公共密钥进行加密,并且密码模式必须为ECB。任何帮助将不胜感激
我是密码学的初学者,请多多包涵。
当然!每个人都必须从某个地方开始。
我想使用RSA加密
您几乎可以肯定不。
使用非对称原语直接加密任意消息几乎从来都不是您在现实世界中要做的。我将在下面解释您想做什么。
使用EBC模式
您也不想使用ECB mode。
RSA + ECB是javax.crypto.Cipher
惯用语。不要遵循他们的示例。
我四处搜寻,并在JavaScript中找到了一个名为JsEncrypt的库,该库通过密钥生成来执行RSA加密,但是文档中没有关于填充所使用的密码模式的内容。
满足您的好奇心:它使用PKCS #1 padding, version 2。
[大多数密码学家don't recommend RSA anymore。大多数安全专家also advise against its use。
您想要libsodium。
在前端,您想将crypto_box_seal()
与ECDH公钥一起使用。在后端,您想将crypto_box_seal_open()
与ECDH密钥对一起使用。
这很容易使用sodium-plus(libsodium的跨平台,异步JavaScript实现)进行演示。
const { SodiumPlus, X25519PublicKey } = require('sodium-plus');
let sodium;
const publicKey = X25519Publickey.from(
'fb1a219011c1e0d17699900ef22723e8a2b6e3b52ddbc268d763df4b0c002e73',
'hex'
);
(async function () {
if (!sodium) sodium = await SodiumPlus.auto();
const message = 'Your message here.';
let sendMe = await sodium.crypto_box_seal(message, publicKey);
console.log(sendMe);
})();
然后您可以传输已加密的数据(存储在sendMe
中,并将其解密到其他位置。
然后您可以找到一个congruent libsodium implementation for your back-end language。
如果在服务器端使用Node.js,则可以使用非常相似的API进行解密。
const { SodiumPlus, X25519PublicKey, X25519SecretKey } = require('sodium-plus');
let sodium;
const secretKey = X25519SecretKey.from(
'0202040a9fbf98e1e712b0be8f4e46e73e4f72e25edb72e0cdec026b370f4787',
'hex'
);
const publicKey = X25519Publickey.from(
'fb1a219011c1e0d17699900ef22723e8a2b6e3b52ddbc268d763df4b0c002e73',
'hex'
);
(async function () {
if (!sodium) sodium = await SodiumPlus.auto();
const encrypted = ''; // Get from client-side
let decrypted = await sodium.crypto_box_seal_open(encrypted, publicKey, secretKey);
console.log(decrypted);
})();
libsodium的优点在于,即使正确使用它,您也不必care发生什么。这就是libsodium的全部内容。
但出于好奇:这是一个密封API,它结合了椭圆曲线Diffie-Hellman密钥协商协议(其中一个密钥对仅使用一次)和经过身份验证的对称密钥加密。
您的消息实际上是使用XSalsa20-Poly1305加密的。加密密钥是根据客户端与服务器的公共密钥生成的一次性(sk, pk)
密钥对的ECDH计算得出的。 (从两个公共密钥的BLAKE2b哈希值中计算出一个随机数。)临时(一次性)公共密钥位于密文之前。
在服务器端,它从密封消息中剥离公钥,执行一致的ECDH计算(以得出您在客户端生成的same对称密钥)。然后,它使用此共享密钥执行XSalsa20-Poly1305解密。
如果服务器端发生任何错误,它将抛出SodiumError
。这意味着密文选择攻击将失败。 (可以使用RSA-ECB保证吗?)
但是您需要知道的是:
encrypted = crypto_box_seal(message, pk)
decrypted = crypto_box_seal_open(encrypted, pk, sk)
钠+(和其他libsodium API)中存在similar APIs,可以解决different cryptography problems。
熟悉像libsodium这样难以滥用的库,可以极大地利用初学者的时间。之后,有CryptoPals用于自我教育。