如何在React Native中使用Javascript在ECB模式下执行RSA加密?

如何在React Native中使用Javascript在ECB模式下执行RSA加密?,javascript,react-native,encryption,Javascript,React Native,Encryption,我是密码学的初学者,请容忍我。我想使用包含EBC模式的RSA encryption。我在JavaScript中搜索并找到了一个名为JsEncrypt的库,该库使用密钥生成执行RSA加密,但文档中没有关于填充密码模式的内容。我正在处理React Native项目,我从安全的第三方API请求公钥。我想做的就是使用第三方已经提供的公钥进行加密,使用RSA加密和密码模式必须是ECB。任何帮助都将不胜感激 我是密码学的初学者,请容忍我 当然可以!每个人都必须从某个地方开始 我想使用RSA加密 你几乎肯定不

我是密码学的初学者,请容忍我。我想使用包含EBC模式的RSA encryption。我在JavaScript中搜索并找到了一个名为JsEncrypt的库,该库使用密钥生成执行RSA加密,但文档中没有关于填充密码模式的内容。我正在处理React Native项目,我从安全的第三方API请求公钥。我想做的就是使用第三方已经提供的公钥进行加密,使用RSA加密和密码模式必须是ECB。任何帮助都将不胜感激

我是密码学的初学者,请容忍我

当然可以!每个人都必须从某个地方开始

我想使用RSA加密

你几乎肯定不会

在现实世界中,直接使用非对称原语加密任意消息几乎从来都不是您想要做的事情。我会在下面解释你想做什么

带EBC模式

你永远都不想用这两种方法

RSA+ECB是一种
javax.crypto.Cipher
习惯用法。不要效法他们的榜样

我在JavaScript中搜索并找到了一个名为JsEncrypt的库,该库使用密钥生成执行RSA加密,但文档中没有关于填充所使用的密码模式的内容

满足你的好奇心:它使用

如何替代RSA-ECB 大多数密码学家。大多数安全专家

你想要利伯纳

在前端,您希望使用带有ECDH公钥的
crypto\u box\u seal()
。在后端,您希望使用ECDH密钥对使用
crypto\u box\u seal\u open()

这可以通过使用(libnaude的跨平台异步JavaScript实现)轻松演示

客户端非对称加密 然后,您可以传输加密数据(存储在
sendMe
)并在其他地方解密

然后你就可以找到一个

如果您使用的是Node.js服务器端,那么可以使用非常类似的API进行解密

服务器端非对称解密 引擎盖下发生了什么? LibNasdium的美妙之处在于,为了正确使用它,你甚至不必关心引擎盖下发生了什么。这就是利伯纳的全部观点

但出于好奇:这是一个密封API,它结合了椭圆曲线Diffie-Hellman密钥协商协议(其中一个密钥对只使用一次)和经过身份验证的对称密钥加密

您的邮件实际上是用XSalsa20-Poly1305加密的。加密密钥根据客户端使用服务器公钥生成的一次性
(sk,pk)
密钥对的ECDH计算。(根据两个公钥的BLAKE2b散列计算一个nonce。)临时(一次性)公钥在密文之前

在服务器端,它从密封的消息中剥离公钥,执行一致的ECDH计算(以获得客户端生成的相同对称密钥)。然后使用该共享密钥执行XSalsa20-Poly1305解密

如果服务器端出现任何错误,它将抛出一个
SodiumError
。这意味着选定的密文攻击将失败。(您能保证RSA-ECB也一样吗?)

但你需要知道的是:

  • 加密:
    encrypted=crypto\u box\u seal(message,pk)
  • 解密:
    decrypted=crypto\u box\u seal\u open(加密、pk、sk)
钠加号(和其他LibNasdium原料药)中有解决问题的成分


熟悉像LibNade这样难以误用的库是对初学者时间的极大利用。之后,还有自我教育的机会。

RSA始终是ECB模式。但是你需要弄清楚使用的是什么填充模式。。eg OAEP-Padding@EbbeM.Pedersen欧洲央行的模式,我想你很喜欢。我们通常使用publickey encryptiom进行密钥交换,并将此密钥与对称加密一起作为AES使用,加密模式为CBC或GCM。
来自安全第三方API的公钥
您确定需要单独加密消息吗?第三方不是在使用某种标准(ws-security?)吗?通常RSA使用混合密码系统,然后API提供了如何格式化加密参数的文档(IV、密码名称等)。我的第三方API提供了使用其算法的加密详细信息,即RSA/ECB/PKCS1。这就是为什么我需要给他们一个加密的消息,这样的配置使用API@Pedersen我认为您在ECB中使用RSA是正确的,但是在JsEncrypt库中,他们没有解释
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);
})();
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);
})();