CTR(Counter mode,CTR)计数器模式

原理 : CTR将块密码变为流密码。它通过递增一个加密计数器以产生连续的密钥流,其中,计数器可以是任意保证长时间不产生重复输出的函数。AES是一种分组加密模式,其中CTR(计数模式)是其中一种工作模式。

加密原理:用密钥对输入的计数器加密,然后同明文异或得到密文。
解密原理:用密钥对输入计数器加密,然后同密文异或得到明文。
从图中可以看出对计数器的加密 ( 即从 C o u n t er K 1 的过程 ) 采用的是 A ES ECB 加密模式
在这里插入图片描述
举个生成的例子来理解

ctr = Counter.new(AES.block_size * 8, initial_value=initial_value)
aes = AES.new(key, counter=ctr, mode=AES.MODE_CTR)
enc = aes.encrypt(msg)
 
  • AES.block_size 用于表示 AES 算法的分组大小(以字节为单位)的常量值。
  • AES 算法支持三种分组大小:16 字节(128 bits)、24 字节(192 bits)和 32 字节(bits 位)。分组大小的选择取决于所使用的 AES 密钥长度
  • 无指定情况下AES.block_size 的值为 16,表示使用 128 bits的分组大小
  • initial_value用于表示计数器的初始值,每使用一次,计数器值加1,确保每次不一样,从而不易被攻击,例如:

initial_value:b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08’
Counter value1: b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08’
Counter value2: b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\t’
Counter value3: b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\n’
Counter value4: b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x0b’
Counter value5: b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x0c’

以此类推,每次加1(转为long型加1,再转为bytes型)

题目描述:

from Crypto.Util.number import *
from Crypto.Cipher import AES
from Crypto.Util import Counter
from hashlib import sha256
from secret import flag
import os
def padding(msg):
    return msg + os.urandom(16 - len(msg) % 16)
msg = b"where is the flag? Key in my Heart/Counter!!!!"
key = b"I w0nder how????"
assert len(msg) == 46
assert len(key) == 16
enc_key = os.urandom(16)
initial_value = bytes_to_long(enc_key)
hash = sha256(str(initial_value).encode()).hexdigest()
aes = AES.new(enc_key, AES.MODE_ECB)
enc_flag = aes.encrypt(padding(flag))
ctr = Counter.new(AES.block_size * 8, initial_value=initial_value)
aes = AES.new(key, counter=ctr, mode=AES.MODE_CTR)
enc = aes.encrypt(msg)
print("enc = {}".format(enc[-16:]))
print("enc_flag = {}".format(enc_flag))
print("hash = {}".format(hash))
enc = b'\xbe\x9bd\xc6\xd4=\x8c\xe4\x95bi\xbc\xe01\x0e\xb8'
enc_flag = b'\xb2\x97\x83\x1dB\x13\x9b\xc2\x97\x9a\xa6+M\x19\xd74\xd2-\xc0\xb6\xba\xe8ZE\x0b:\x14\xed\xec!\xa1\x92\xdfZ\xb0\xbd\xb4M\xb1\x14\xea\xd8\xee\xbf\x83\x16g\xfa'
hash = efb07225b3f1993113e104757210261083c79de50f577b3f0564368ee7b25eeb

题目分析:

在这里插入图片描述
由流程可知,明文msg和密文enc_flag已知,那么两者异或就能得到K3(分三组:16 16 14,不需填充)
但此K3非彼K3,此K3是14字节,实际上K3是16字节,所以要得到真正的K3得进行填充
注意这里是往后填充,不是往前填充
(从流程图确实很容易想到是往前填充。但此处是CRT库里面的自己实现的,类似于规定一样,测试出来的数据确实也表明是往后填充,我想这应该也就是所说的 CTR模式不需要padding的原因吧)
在末尾爆破两字节得到真正的K3,然后-2即可得到初始Counter,即initial_value
initial_value出来了,那么flag差不多也就出来了

from Crypto.Util.number import *
from Crypto.Cipher import AES
from Crypto.Util import Counter
from hashlib import sha256
msg = b"where is the flag? Key in my Heart/Counter!!!!"
key = b"I w0nder how????"
enc = b'\xbe\x9bd\xc6\xd4=\x8c\xe4\x95bi\xbc\xe01\x0e\xb8'
enc_flag = b'\xb2\x97\x83\x1dB\x13\x9b\xc2\x97\x9a\xa6+M\x19\xd74\xd2-\xc0\xb6\xba\xe8ZE\x0b:\x14\xed\xec!\xa1\x92\xdfZ\xb0\xbd\xb4M\xb1\x14\xea\xd8\xee\xbf\x83\x16g\xfa'
hash = 'efb07225b3f1993113e104757210261083c79de50f577b3f0564368ee7b25eeb'
a = msg[32:]
b = enc[2:]
enc_Counter1 = bytes(a[i] ^ b[i] for i in range(14))
for i in range(256):
    for j in range(256):
        enc_Counter2 = enc_Counter1 + bytes([i]) + bytes([j])
        aes = AES.new(key,AES.MODE_ECB)
        Counter = aes.decrypt(enc_Counter2)
        initial_value = bytes_to_long(Counter) - 2
        if hash == sha256(str(initial_value).encode()).hexdigest():
            enc_key = long_to_bytes(initial_value)
            aes = AES.new(enc_key,AES.MODE_ECB)
            flag = aes.decrypt(enc_flag)
            print(flag)
            break
# flag{9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d}

学到了AES-CTR加密模式,往后填充哪里确实需要我们记住
还有,当时看了很多资料,发现大家都是这样说的(引用一下):

计数器的生成方法

每次加密时都会生成一个不同的值(nonce)来作为计数器的初始值。当分组长度为128比特(16字节)时,计数器的初始值可能是像下面这样的形式
在这里插入图片描述
其中前8个字节为nonce(随机数),这个值在每次加密时必须都是不同的,后8个字节为分组序号,这个部分是会逐次累加的。在加密的过程中,计数器的值会产生如下变化:在这里插入图片描述

这应该是初始值只有8字节的时候吧
如果初始值就是16字节,那Counter value1的值就是初始值,之后的Counter value便是每次在初始值后加1,也就没有所谓的后8字节为分组序号组这一说法,就像上面讲原理是所介绍的那个例子。我理解的大致是这样,因为遇到的题目确实是按这个想法才能解。
学艺不精,还有待提升,继续加油!

So, lets look at how CBC works first. The following picture shows the encryption when using CBC (in this case, using AES as the cipher). Basically, Cipher-Block-Chaining means that previous to putt...
|版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址: https://blog.csdn.net/sgsgy5 具体封装的所有函数的加密包github地址:https://github.com/wumansgy/goEncrypt CTR 模式 CTR模式的全称是CounTeR模式(计数器模式)。CTR摸式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码(下图)。 CT...
分组密码有五种工作体制:1.电码本模式(ElectronicCodebookBook(ECB));2.密码分组链接模式(CipherBlockChaining(CBC));3.计算器模式(Counter(CTR));4.密码反馈模式(CipherFeedBack(CFB));5.输出反馈模式(OutputFeedBack(OFB))。 以下逐一介绍一下: 1.电码本模式(...
AES是一种对称加密算法,它的相关概念在此不赘述。 GCM ( Galois/Counter Mode) 是对称加密的一种加密模式。 在介绍AES-GCM之前,我们先了解一些相关概念。 下文中出现的符号:
AES-CTRAES算法的计算器模式(Counter (CTR)),这种计算器模式不常见,在CTR模式中, 有一个自增的算子(IV,后四个字节相当于计数器,每次计算递增),这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。CTR加密过程的示意图如下所示: ##############################################################
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class AES { public static final String KEY_ALGORITHM = "AES"; publ.
//aes是对称加密算法的一种,Ctr是分组迭代模式的一种,需要初始向量,使用了流密钥而非分组密钥 func aesEncrypt(plainText, key []byte) ([]byte, error) { //1 ...
NIST标准,AES加密模式介绍包括(ECB,CBC,CFB,OFB,CTR)。This recommendation defines five confidentiality modes of operation for use with an underlying symmetric key block cipher algorithm: Electronic Codebook (ECB), Cipher Block Chaining (CBC), Cipher Feedback (CFB), Output Feedback (OFB), and Counter (CTR). Used with an underlying block cipher algorithm that is approved in a Federal Information Processing Standard (FIPS), these modes can provide cryptographic protection for sensitive, but unclassified, computer data.
包含内容:SM4国密加密算法C语言实现 包括 Spec,C代码,测试用例和分组密码有五种工作体制: 1.电码本模式(Electronic Codebook Book (ECB)); 2.密码分组链接模式(Cipher Block Chaining (CBC)); 3.计算器模式(Counter (CTR)); 4.密码反馈模式(Cipher FeedBack (CFB)); 5.输出反馈模式(Output FeedBack (OFB))
1.hls HTTP实时流(也称为HLS)是一种基于HTTP的媒体流通信协议,由Apple Inc.制定。它类似于MPEG-DASH,它的工作原理是将整个流分解为一系列基于HTTP的小文件下载,每次下载都加载一个分片。当播放流时,客户端可以从多个不同备选流中选择,这些备选流包含不同编码速率的码流,从而允许流会话适应可用的数据速率。在流会话开始时,HLS下载一个扩展的M3U播放列表,其中包含各种可用子流的元数据。 2.加密方式 hls可以允许码流加密和不加密,其中加密方式有几种:aes-128, sampl
AES-CBC加密算法中,数据被分成固定大小的块,然后每个块被加密。在加密之前,需要将每个块与前一个块进行异或操作,以便增加加密的随机性。这个过程被称为“CBC模式”的加密。 在AES-CBC加密算法中,每个块的格式如下: | IV | CipherText | |------|---------------------| | 随机数 | 经过AES加密的明文块 | 其中,“IV”是初始化向量,它是一个随机数,用于增加加密的随机性。每个块的大小通常是128位或256位,具体取决于加密算法的实现。 在解密过程中,需要使用相同的初始化向量和密钥来解密每个块。由于每个块都与前一个块进行了异或操作,因此需要使用前一个块的密文来解密当前块。 总的来说,AES-CBC加密算法中的帧格式非常简单,但是由于需要处理每个块与前一个块的异或操作,因此需要一些额外的工作来实现加密和解密。