0

我在 pysodium 0.6.6 中使用带有 python 绑定的 libsodium

使用crypto_boxand时crypto_box_open,我总是得到一个ValueError. 这是一个简单的例子:

import pysodium
import random

serverPK, serverSK = pysodium.crypto_box_keypair()
clientPK, clientSK = pysodium.crypto_box_keypair()

testText = "test message"

nonce1 = str(random.random())
nonce2 = str(random.random())

cipherText = pysodium.crypto_secretbox(testText,nonce1,clientPK)
message = pysodium.crypto_secretbox_open(cipherText, nonce2, clientSK)
print message

这是错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/.../pysodium-0.6.6/pysodium/__init__.py", line 181, in crypto_box_open
__check(sodium.crypto_box_open(msg, padded, ctypes.c_ulonglong(len(padded)), nonce, pk, sk))
  File "/Users/.../pysodium-0.6.6/pysodium/__init__.py", line 70, in __check
raise ValueError
ValueError
4

1 回答 1

2

crypto_box_keypair()创建一个密钥对,用于crypto_box().

crypto_secretbox()不是非对称加密:加密和解密都使用一个密钥。如果这实际上是您想要的,则可以通过这种方式生成密钥:

key = pysodium.randombytes(pysodium.crypto_secretbox_KEYBYTES)

对于给定的密钥,nonce 对于每条消息必须是唯一的,并且必须是pysodium.crypto_secretbox_NONCEBYTES字节长。它可以是一个简单的计数器,也可以是一个随机数:

nonce = pysodium.randombytes(pysodium.crypto_secretbox_NONCEBYTES)

与密钥不同,nonce 可以是公开的。但加密和解密必须相同:

cipherText = pysodium.crypto_secretbox(testText, nonce, key)
message = pysodium.crypto_secretbox_open(cipherText, nonce, key)

libsodium 文档提供了有关如何使用boxsecretbox的示例,可以轻松地将其转换为 pysodium 等价物。

于 2015-06-01T22:49:59.783 回答