これが私がHaskellでやろうとしていることです:
- ByteString形式でメッセージを受け取ります(怠惰であるか厳密であるかは実際には関係ありません)
- RSA公開鍵でメッセージを暗号化する
- base64は暗号化されたメッセージをエンコードします
私が使用しているRSAライブラリは、レイジーByteStringsを内部で処理します。ただし、Base64ライブラリは厳密なByteStringのみを使用します。私のアプリケーションは、怠惰なByteStringsを使用してメッセージをネットワークソケットに送信します。
したがって、怠惰なByteStringと厳密なByteStringの間で変換する必要があるようです。これが私がすることです:
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]
残念ながら、これが失敗することがあります。この方法で暗号化されたメッセージを復号化すると、実際のメッセージの後にガベージが続くことがあります。問題がどこにあるのか正確にはわかりません。レイジーから厳密なByteStringsへの変換なのか、それともbase64エンコーディングステップなのか。それとも両方ですか?
Lazy ByteStringsは、厳密なByteStringチャンクの単なるリストです。メッセージを変換して暗黙的にメッセージの長さを変更しますか?
教えてください。