如何在React Native中使用Javascript在ECB模式下执行RSA加密?
我是密码学的初学者,请容忍我。我想使用包含EBC模式的RSA encryption。我在JavaScript中搜索并找到了一个名为JsEncrypt的库,该库使用密钥生成执行RSA加密,但文档中没有关于填充密码模式的内容。我正在处理React Native项目,我从安全的第三方API请求公钥。我想做的就是使用第三方已经提供的公钥进行加密,使用RSA加密和密码模式必须是ECB。任何帮助都将不胜感激 我是密码学的初学者,请容忍我 当然可以!每个人都必须从某个地方开始 我想使用RSA加密 你几乎肯定不会 在现实世界中,直接使用非对称原语加密任意消息几乎从来都不是您想要做的事情。我会在下面解释你想做什么 带EBC模式 你永远都不想用这两种方法 RSA+ECB是一种如何在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加密 你几乎肯定不
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)
熟悉像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);
})();