AES による暗号化・復号化

2020年12月27日

はじめに

AES による暗号化・復号化について。

Python による暗号化

pycryptodome を用いる。

from Crypto.Cipher import AES

key = "1234567890123456"
msg = "abcdefghijklmnop"

iv = b"0"*AES.block_size
crypto = AES.new(key.encode(), AES.MODE_CBC, iv)

data = crypto.encrypt(msg.encode())
print(" ".join(hex(n) for n in data))

with open("test.dat", "wb") as f:
    f.write(data)

crypto = AES.new(key.encode(), AES.MODE_CBC, iv)

org_msg = crypto.decrypt(data)

print(" ".join(hex(n) for n in org_msg))
org_msg = org_msg.decode()
print(org_msg)

msg を "test.dat" に書き出す。ほんとうは iv はランダムで決めて、iv も一緒にファイルに保存すべきらしい。

参考: Good AES Initialization Vector practice (stackoverflow)

C による復号化

tiny-AES-c というものが使える。

#include 

#include "aes.h"


int main(void)
{
    const char key_str[] = "1234567890123456";
    FILE *fp;
    unsigned char key[16];
    unsigned char buffer[16];
    unsigned char iv[16];
    struct AES_ctx ctx;
    int i;

    for (i = 0; i < 16; i++) {
        key[i] = key_str[i];
    }

    fp = fopen("test.dat", "rb");

    if (fp == NULL) {
        printf("error: Can't open file: test.dat");
            return 1;
    }

    fread(buffer, sizeof(char), 16, fp);

    fclose(fp);

    for (i = 0; i < 16; i++) {
        printf("0x%x ", buffer[i]);
    }
    printf("\n");

    for (i = 0; i < 16; i++) {
        iv[i] = '0';
    }

    AES_init_ctx_iv(&ctx, key, iv);
    AES_CBC_decrypt_buffer(&ctx, buffer, 16);

    for (i = 0; i < 16; i++) {
        printf("0x%x ", buffer[i]);
    }
    printf("\n");

    for (i = 0; i < 16; i++) {
        printf("%c", buffer[i]);
    }
    printf("\n");

    return 0;
}