gpt4 book ai didi

haskell - 将 base64-bytestring 与惰性 ByteString 结合使用

转载 作者:行者123 更新时间:2023-12-02 18:16:18 26 4
gpt4 key购买 nike

这是我在 Haskell 中尝试做的事情:

  • 以 ByteString 格式获取消息(惰性或严格并不重要)
  • 使用 RSA 公钥加密消息
  • 对加密消息进行 Base64 编码

RSA library我正在使用内部处理惰性字节字符串。 Base64然而,库仅使用严格的字节字符串。我的应用程序使用惰性字节字符串将消息发送到网络套接字。

所以,看来我必须在惰性字节字符串和严格字节字符串之间进行转换。这就是我所做的:

encrypt :: CryptoRandomGen t => t -> RSA.PublicKey -> L.ByteString -> L.ByteString
encrypt gen pubkey msg = do
let (ciphertext,_) = RSA.encrypt gen pubkey msg
(L.fromChunks . map encode . L.toChunks) $ ciphertext

decrypt :: RSA.PrivateKey -> L.ByteString -> Either String L.ByteString
decrypt privkey ciphertext = do
dec <- decode $ S.concat $ L.toChunks ciphertext
return $ RSA.decrypt privkey $ L.fromChunks [dec]

不幸的是,有时会失败。当我解密以这种方式加密的消息时,有时会导致垃圾,然后是实际消息。我不确定问题到底出在哪里:是从惰性字节字符串到严格字节字符串的转换还是base64编码步骤?或者两者兼而有之?

惰性字节串只是严格字节串 block 的列表。我是否可以通过转换来隐式修改消息的长度?

请赐教。

最佳答案

问题在于,base64 编码将输入的每三个字节(3 × 8 位)映射到输出的四个字节(4 × 6 位),因此当输入的大小不是 3 的倍数时,它必须添加填充。这意味着连接单独编码每个 block 的结果可能不会得到与编码整个事物相同的结果。

> encode "Haskell"
"SGFza2VsbA=="
> encode "Hask" `append` encode "ell"
"SGFzaw==ZWxs"

请注意,即使您删除用于填充输出的 = 字符,这些也是不同的。输入的填充仍然会导致问题。

您最好的选择可能是找到一个支持惰性字节串的库,但确保所有 block (最后一个 block 除外)的大小是三的倍数可以作为解决方法。

或者,如果您不介意将整个内容保留在内存中,请将惰性字节串转换为严格字节串,一步对整个内容进行编码,然后转换回来(如果需要)。

关于haskell - 将 base64-bytestring 与惰性 ByteString 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10154503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com