2016-08-09 7 views
0

pycryptoを使ってPythonでいくつかのJS(SJCLライブラリを使用する)を書き直そうとしています。 は私がPythonでSJCL .frombitsを実装する

aes = new sjcl.cipher.aes(this.key); 
bits = sjcl.codec.utf8String.toBits(text); 
cipher = sjcl.mode.ccm.encrypt(aes, bits, iv); 
cipherIV = sjcl.bitArray.concat(iv, cipher); 
return sjcl.codec.base64.fromBits(cipherIV); 

次のコードを実装する方法を考え出すのトラブルを抱えている私の問題は、暗号化ではありませんが、方法は、ライブラリはfromBits変換を処理します。

私たちの暗号プリミティブのほとんどは内部的に4バイトワードの配列を処理しますが、その多くは4バイトの倍数ではない引数を取ることができます。このライブラリは、(8ビットの倍数である必要はない)ビット配列を32ビットワードの配列としてエンコードします。ビットはビッグエンディアンで、一度に32ビットずつワードの配列にパックされます。ワードは倍精度浮動小数点数なので、余分なデータに適合します。私たちはこれを(プライベートで、おそらく変化する方法で)使用して、配列の最後の単語に実際に存在するビット数をコード化します。私に

これは連結運転中に流行になります私が懸念していた、付加的な情報のいくつかの並べ替えに追加ビット配列への変換を意味するようです。さらに、連結の後、結果はbase64ストリングとして戻されます。私はこれを複製するための適切な 'struct'パッキングパラメータが不明です。

答えて

1

このコードをよく見ると、自己完結型であることがわかります。このコードの実行後、SJCLの "ビット"(ネイティブバイナリデータ表現)は必要ありません。この内部データは暗号化および連結機能に与えられ、その結果は移植可能な「通常の」Base64エンコードされた文字列に変換されます。

このコードに存在する唯一の問題は、this.keyìvのエンコーディングです。

PyCryptoにはバイナリ文字列またはbytes(Pythonのバージョンによって異なる)が既に用意されているため、特殊な内部バイナリデータエンコーディングはありません。しかし、あなたはまだBase64エンコーディングで文字列をエンコード/デコードする必要があります。