aes-cbc一例

#!/usr/bin/python
from Crypto.Cipher import AES
import binascii
from Crypto.Util.number import bytes_to_long
from flag import flag
import random
import string
import os

def genkey(l):
    return random.getrandbits(l)

iv = flag.strip(b'flag{').strip(b'}')

key = ''.join([random.choice(string.ascii_letters+string.digits) for _ in xrange(16)])
LENGTH = len(key)
assert LENGTH == 16

hint = os.urandom(4) * 8
print(bytes_to_long(hint)^bytes_to_long(key))

msg = b'Welcome, ctfer. Dont try too hard, its no use. Have a good day!!'

def encrypto(message):
    aes = AES.new(key,AES.MODE_CBC,iv)
    return aes.encrypt(message)

print(binascii.hexlify(encrypto(msg))[-32:])

'''
99748265546679089946917295913637945222843938798184123305418691873367322323659
bc03f3ac4ff8064acbcfaf0b0bf2ba7b
'''

本质是倒推出初始向量iv

msg共64byte,分为4组,给出最后一组的密文。key可以求出。

#!/usr/bin/python
from Crypto.Cipher import AES
import binascii
from Crypto.Util.number import *
from Crypto.Util.strxor import strxor as xor


msg = b'Welcome, ctfer. Dont try too hard, its no use. Have a good day!!'

hint=99748265546679089946917295913637945222843938798184123305418691873367322323659
c=0xbc03f3ac4ff8064acbcfaf0b0bf2ba7b
key=(hint>>(16*8))^(hint&((1<<16*8)-1))


key=long_to_bytes(key)
byte_c=long_to_bytes(c)

for msg_i in range(3,-1,-1):
    aes = AES.new(key,AES.MODE_ECB)
    print(msg[msg_i*16:msg_i*16+16])
    byte_c=xor(aes.decrypt(byte_c),msg[msg_i*16:msg_i*16+16])
print(byte_c)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AES(Advanced Encryption Standard)是一种对称加密算法,其中AES-256是AES的一种加密模式,使用256位密钥对数据进行加密和解密。下面是一个基于C语言的实现AES-256加密的例子: 首先,我们需要一个AES库,可以使用开源库如OpenSSL来实现AES加密。在此例中,我们将使用OpenSSL库。确保已经安装了OpenSSL库。 接下来,我们需要包含OpenSSL库的头文件,并链接相关的库。在源码文件的开始,我们添加以下代码: ```c #include <stdio.h> #include <string.h> #include <openssl/aes.h> #pragma comment(lib, "libeay32.lib") // 添加OpenSSL库的链接 int main() { // 设置AES-256的密钥 unsigned char *key = (unsigned char *)"01234567890123456789012345678901"; // 设置要加密的明文 unsigned char *plaintext = (unsigned char *)"hello world"; // 设置要加密的数据长度 int plaintext_len = strlen((const char *)plaintext); // 设置加密后的密文长度 int ciphertext_len = 0; // 设置初始化向量(IV) unsigned char iv[AES_BLOCK_SIZE]; memset(iv, 0x00, sizeof(iv)); // 创建AES结构体 AES_KEY aes_key; // 设置AES密钥 AES_set_encrypt_key(key, 256, &aes_key); // 创建存储加密后的密文的数组 unsigned char ciphertext[plaintext_len + AES_BLOCK_SIZE]; // 使用AES加密算法加密明文 AES_cbc_encrypt(plaintext, ciphertext, plaintext_len, &aes_key, iv, AES_ENCRYPT); // 输出加密后的密文 for (int i = 0; i < plaintext_len + AES_BLOCK_SIZE; i++) { printf("%02x ", ciphertext[i]); } printf("\n"); return 0; } ``` 在这个例子中,我们使用了一个256位的密钥,将明文"hello world"加密。然后将加密后的密文输出到控制台。 编译并运行这个程序,你将会看到一个由16进制数字组成的字符序列,代表加密后的密文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值