【问题标题】:Different cipher text using different implementation of sodium library?不同的密文使用不同的钠库实现?
【发布时间】:2020-09-23 11:05:33
【问题描述】:

我使用 php 使用 libsodium 创建了一个密文,如下所示:

$contents = 'Hello World!';
$key = sodium_hex2bin('9fcc21c22142e0cb30e80da941cf1fd2221a3d273b232dac12d0d195d50c0202', '');
$nonce = sodium_hex2bin('dd024212d41933c01417bd2aa2b64682224072c8aa1573f3', '');
$cipher = sodium_crypto_secretbox($contents, $nonce, $key);
echo bin2hex($cipher);
// output: 0af8d46269eae0788ce4c20569067724402e410b35d9a0c5197be955

然后,在我的 react native 应用程序中,我使用了react-native-libsodium(java libsodium-jni 的包装器)来生成相同的密码:

const test = async() => {
  let cipher = await Sodium.crypto_secretbox_easy(
    "Hello World!",
    "dd024212d41933c01417bd2aa2b64682224072c8aa1573f3",
    "9fcc21c22142e0cb30e80da941cf1fd2221a3d273b232dac12d0d195d50c0202"
  );
  console.log(cipher);
};
await test();
// output: 6d6ca73e3daa63a661a813c8ab6fb49f798e68965c3267eb7e1c6cdc

我使用另外两个 javascript 库 sodium-nativesodium-plus 测试了该操作。在这两种情况下,结果密文与php版本相同。

由于某些原因,我更喜欢使用 react-native-libsodium,但一天后我找不到这个库生成不同密文的原因以及如何解决这个问题。如何生成相同的密文?

【问题讨论】:

    标签: java php react-native libsodium


    【解决方案1】:

    crypto_secretbox_easy的第三个参数应该是消息的长度,然后是nonce。如此处所示:https://stackoverflow.com/a/23646032/5878961

    【讨论】:

    • 不,java函数需要消息长度作为参数,但是在javascript包装器中需要3个参数,就像我在代码中使用的那样。
    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    相关资源
    最近更新 更多