2

既存のC関数からPythonに暗号化/復号化をミラーリングする方法を理解しようとしています。ただし、Cで暗号化してPythonで復号化するテストでは、キーの周りのいくつかの要素を理解できません。

これらはすべてオンラインのコードサンプルだったので、Pythonでのbase64呼び出しなどにコメントしましたが、現時点ではわかりません。

1)KEYBITからKEY_SIZE/BLOCK_SIZEの設定を正しく決定した場合。

2)Cコードと一致するようにPythonでパスワードからキーを取得する方法。

3)コア変換ステップがありませんか?

Cのrijndael.h:

#define KEYLENGTH(keybits) ((keybits)/8)
#define RKLENGTH(keybits)  ((keybits)/8+28)
#define NROUNDS(keybits)   ((keybits)/32+6)

Cでの暗号化

#define KEYBITS 256

unsigned long rk[RKLENGTH(KEYBITS)];
unsigned char key[KEYLENGTH(KEYBITS)];

char *password = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

for (i = 0; i < sizeof(key); i++)
    key[i] = *password != 0 ? *password++ : 0;  

nrounds = rijndaelSetupEncrypt(rk, key, 256);

count = 0;
while (count < strlen(input)) {
    unsigned char ciphertext[16];
    unsigned char plaintext[16];
    for (i = 0; i < sizeof(plaintext); i++) {
        if (count < strlen(input))
            plaintext[i] = input[count++];
        else
            plaintext[i] = 0;
    }
    rijndaelEncrypt(rk, nrounds, plaintext, ciphertext);
    if (fwrite(ciphertext, sizeof(ciphertext), 1, output) != 1)             
        fclose(file);
        fputs("File write error", stderr);
        return 0;
    }
}

Pythonで復号化

KEY_SIZE = 32
BLOCK_SIZE = 16

def decrypt(password, filename):

    #
    # I KNOW THIS IS WRONG, BUT HOW DO I CONVERT THE PASSWD TO KEY?
    #
    key = password

    padded_key = key.ljust(KEY_SIZE, '\0')

    #ciphertext = base64.b64decode(encoded)
    ciphertext = file_get_contents(filename);

    r = rijndael(padded_key, BLOCK_SIZE)

    padded_text = ''
    for start in range(0, len(ciphertext), BLOCK_SIZE):
        padded_text += r.decrypt(ciphertext[start:start+BLOCK_SIZE])

    plaintext = padded_text.split('\x00', 1)[0]

    return plaintext

ありがとう!

4

1 に答える 1

0

例のCコードは、password文字列からキーに32バイトをコピーするだけです。キーが32バイト未満の場合、右側にゼロが埋め込まれます。Pythonに翻訳すると、これは次のようになります。

key = password[:32]+b'\x00'*(32-len(password))

これは実際にはと同じ結果を生成します

password.ljust(32, '\0')

ただし、このキーの生成方法は非常に危険であると見なされていることに注意してください。キーが0バイトで埋められたASCII文字で構成されていると攻撃者が疑う場合、キースペース(可能なキーの量)は大幅に削減されます。キーがランダムなバイトで構成されている場合、256 ^ 32=1.15e77のキーがあります。たとえば、キーが8つのASCII文字で始まり、その後にゼロが続く場合、可能なキーは(127-32)^ 8=6.63e15のみです。また、頻繁に使用されるパスワードを含む辞書が存在するため、攻撃者はおそらくこの削減されたキースペースを使い果たす必要はありません。彼は最初に比較的小さな辞書を試してみました。

パスフレーズをキーに変換するには、暗号化ハッシュ関数または別の適切なキー導出関数を使用することを検討してください。

pycryptoツールキットを使用してみてください。Rijndael/AESおよびその他の暗号を実装します。

于 2012-09-30T14:46:04.413 に答える