更新! 我们已经成功地在 TweetLua 和 PyNaCl 之间传递文件!编写 Lua 端代码的人有一个“差一”错误(愚蠢,但我们的大多数错误不是吗?)。一旦我们将正确的零件放在适当的位置,就很容易了。
我知道使用 Lua 而不是 JavaScript 并不能完美地解决这个问题,但我希望发现这个问题的人都能得到一些相同的使用。归结为:是的,正如您所期望的那样,TweetNaCl 和 PyNaCl 是兼容的。
此过程中的重要元素:
- TweetNaCl 在装箱和拆箱时将 MAC、Nonce、P_key 和 K_key 作为单独的参数。
- PyNaCl 没有。捕获发送者的P_key,导入,做一个盒子,然后将剩余的密文作为一个单元传递。PyNaCl 将为您提取 Nonce 和 MAC。
Lua加密:
local function main(flag, files, keys)
local pt = chunkpt(flag, files) # We broke large files down
files.fout_size = companyfilesize(flag, pt)
files.fout = assert(io.open(flag.outfile, "wb"))
local current = files.fout:seek()
files.fout:seek("set", files.fout_size - 1)
files.fout:write("x")
files.fout:seek("set", current)
local err
local ct = {}
local nonce = {}
local mac = {}
local root
local nonceroot
local macroot
local n = #pt
for i = n, 1, -1 do
nonce[i] = nacl.randombytes(NONCE_LEN)
if i == n then
ct[i], err = nacl.box(pt[i], nonce[i], keys.p_rx, keys.k)
if err ~= nil then error("boxing error") end
else
ct[i], err = nacl.box(pt[i] .. nonce[i + 1] .. mac[i + 1], nonce[i],
keys.p_rx, keys.k)
if err ~= nil then error("boxing error") end
end
mac[i] = ct[i]:sub(1, MAC_LEN)
ct[i] = ct[i]:sub(MAC_LEN + 1, -1)
end
files.fout:seek("set", 0)
local header = header_info
files.fout:write(header)
files.fout:write(keys.p_tx)
files.fout:write(nonce[1])
files.fout:write(mac[1])
files.fout:write(ct[1])
files.fin:close()
files.fout:close()
return 0
end
Python解密:
def decrypt_box():
with open("encrypted_file.companybox", 'rb') as f:
header = f.read(16) # We use this for internal info
senderPubKey = f.read(32)
cyphertext = f.read()
f.close()
# Import the secret key for use in the decryption
imported_private_key = nacl.public.PrivateKey(BOB_SECRET_KEY)
# Import the public key we just found in the file
imported_public_key = nacl.public.PublicKey(senderPubKey)
# Make a box with the 2 keys
plain_box = Box(imported_private_key, imported_public_key)
# Pass the remaining text (that includes the Nonce and MAC) to decode
plain = plain_box.decrypt(cyphertext)
print(plain.decode('utf-8'))
以前的回应:
据我所知,不,TweetNaCl 和 PyNaCl 不兼容。我的小组正在尝试使用 c# TweetNaCl 加密文件并使用 python 解密,我总是以一般的nacl.exceptions.CryptoError: An error occurred trying to decrypt the message
. 如果您/其他人想出了一个解决方案,我很想听听!