pysodium crypto_box_open抛出ValueError

时间:2015-06-01 16:03:16

标签: python libsodium

我使用libsodium与pysodium 0.6.6中的python绑定

使用crypto_boxcrypto_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

1 个答案:

答案 0 :(得分: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等效文件。