3

私はPythonとpycryptoを初めて使用します。AES-CTRを実装しようとしています。プログラムの暗号化が正しいかどうかを確認するために、NIST SP 800-38A標準(セクションF.5)のテストシーケンスを使用しようとしました。しかし、正しい結果が得られません。私は何が間違っているのですか?

from Crypto.Cipher import AES
from Crypto.Utils import Counter

CTRkey="2b7e151628aed2a6abf7158809cf4f3c"
ctr=Counter.new(128, initial_value=int("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",16))
cipherCTR=AES.new(CTRkey, AES.MODE_CTR, counter=ctr)
print(cipherCTR.encrypt("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff".decode("hex")).encode("hex"))

結果:

0008007df81ad564b9aadd6b883fef16

しかし、期待される結果(暗号文)は次のとおりです。

874d6191b620e3261bef6864990db6ce
4

3 に答える 3

3

NIST SP 800-38A標準(セクションF.5.1)では、CTR-AES128暗号化操作への入力は、入力ブロックではなくプレーンテキストと呼ばれます。

平文( )を使用する6bc1bee22e409f96e93d7e117393172aと、正しい結果である暗号文 874d6191b620e3261bef6864990db6ceが得られます。

于 2013-02-06T22:20:27.070 に答える
1

これを試してみました。

import Crypto.Cipher.AES
import Crypto.Util.Counter

import binascii

key = b'\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
iv = b'\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
text = b'\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a'

ctr = Crypto.Util.Counter.new(128, initial_value=int(binascii.hexlify(iv), 16))
cipher = Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_CTR, counter=ctr)
print(cipher.encrypt(text).encode("hex"))

結果を得た

874d6191b620e3261bef6864990db6ce

バイナリデータを使用してください。str.encode( "hex")はお勧めしません。

于 2018-11-15T08:48:43.760 に答える
0

SquareRootOfTwentyThreeで言及されている適切なプレーンテキスト値を使用する以外に、コードで使用されているデータのタイプも考慮する必要があります。PyCryptoのドキュメントでは、キーのデータ型はバイトであることが示されていますが、カウンターはint型またはbytes型である可能性があります。

NIST SP 800-38Aに記載されている暗号文を取得するには、適切なデータ型を使用する必要があります。Kameelのコードは機能しますが、私もそのコードを回答に含めました。

from Crypto.Cipher import AES
import Crypto.Utils.Counter
import binascii

CTRkey     = b'\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
iv         = b'\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
plain_text = b'\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a'

ctr       = Crypto.UtilsCounter.new(128, initial_value=int(binascii.hexlify(iv), 16))
cipherCTR = AES.new(CTRkey, AES.MODE_CTR, counter=ctr)
print(cipherCTR.encrypt(plain_text).encode("hex"))



于 2020-01-24T13:16:16.823 に答える