我使用libsodium与pysodium 0.6.6中的python绑定
使用crypto_box
和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
答案 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文档提供了有关如何使用box和secretbox的示例,这些示例可以轻松转换为pysodium等效文件。