Cryptography 在格拉德曼';在AES-CTR实现中,if(b_pos)代码部分的用途是什么?

Cryptography 在格拉德曼';在AES-CTR实现中,if(b_pos)代码部分的用途是什么?,cryptography,aes,Cryptography,Aes,试图了解Brian Gladman博士的AES-CTR实现。(http://gladman.plushost.co.uk/oldsite/AES/aes-src-12-09-11.zip aes_模式(第849行及以后) 我读过CTR算法,但这个实现让我感到困惑。我无法看到它如何与CTR模式算法匹配 if(b_pos)代码部分的用途是什么 我也不明白这个条件 b_位置0时始终为1。AES_块大小为16 if(b_pos) { memcpy(buf, cbuf, A

试图了解Brian Gladman博士的AES-CTR实现。(http://gladman.plushost.co.uk/oldsite/AES/aes-src-12-09-11.zip aes_模式(第849行及以后) 我读过CTR算法,但这个实现让我感到困惑。我无法看到它如何与CTR模式算法匹配

if(b_pos)代码部分的用途是什么

我也不明白这个条件 b_位置 因为(AES_BLOCK_SIZE&&len)在len>0时始终为1。AES_块大小为16

    if(b_pos)
    {
        memcpy(buf, cbuf, AES_BLOCK_SIZE);
        if(aes_ecb_encrypt(buf, buf, AES_BLOCK_SIZE, ctx) != EXIT_SUCCESS)
            return EXIT_FAILURE;

        while(b_pos < AES_BLOCK_SIZE && len)
        {
            *obuf++ = *ibuf++ ^ buf[b_pos++];
            --len;
        }

        if(len)
            ctr_inc(cbuf), b_pos = 0;
    }





AES_RETURN aes_ctr_crypt(const unsigned char *ibuf, unsigned char *obuf,
            int len, unsigned char *cbuf, cbuf_inc ctr_inc, aes_encrypt_ctx ctx[1])
{   unsigned char   *ip;
    int             i, blen, b_pos = (int)(ctx->inf.b[2]);
    uint_8t buf[BFR_LENGTH];
    if(b_pos)
    {
        memcpy(buf, cbuf, AES_BLOCK_SIZE);
        if(aes_ecb_encrypt(buf, buf, AES_BLOCK_SIZE, ctx) != EXIT_SUCCESS)
            return EXIT_FAILURE;

        while(b_pos < AES_BLOCK_SIZE && len)
        {
            *obuf++ = *ibuf++ ^ buf[b_pos++];
            --len;
        }

        if(len)
            ctr_inc(cbuf), b_pos = 0;
    }
    while(len)
    {
        blen = (len > BFR_LENGTH ? BFR_LENGTH : len), len -= blen;

        for(i = 0, ip = buf; i < (blen >> 4); ++i)
        {
            memcpy(ip, cbuf, AES_BLOCK_SIZE);
            ctr_inc(cbuf);
            ip += AES_BLOCK_SIZE;
        }

        if(blen & (AES_BLOCK_SIZE - 1))
            memcpy(ip, cbuf, AES_BLOCK_SIZE), i++;

        if(aes_ecb_encrypt(buf, buf, i * AES_BLOCK_SIZE, ctx) != EXIT_SUCCESS)
            return EXIT_FAILURE;

        i = 0; ip = buf;
            while(i + AES_BLOCK_SIZE <= blen)
            {
                obuf[ 0] = ibuf[ 0] ^ ip[ 0]; obuf[ 1] = ibuf[ 1] ^ ip[ 1];
                obuf[ 2] = ibuf[ 2] ^ ip[ 2]; obuf[ 3] = ibuf[ 3] ^ ip[ 3];
                obuf[ 4] = ibuf[ 4] ^ ip[ 4]; obuf[ 5] = ibuf[ 5] ^ ip[ 5];
                obuf[ 6] = ibuf[ 6] ^ ip[ 6]; obuf[ 7] = ibuf[ 7] ^ ip[ 7];
                obuf[ 8] = ibuf[ 8] ^ ip[ 8]; obuf[ 9] = ibuf[ 9] ^ ip[ 9];
                obuf[10] = ibuf[10] ^ ip[10]; obuf[11] = ibuf[11] ^ ip[11];
                obuf[12] = ibuf[12] ^ ip[12]; obuf[13] = ibuf[13] ^ ip[13];
                obuf[14] = ibuf[14] ^ ip[14]; obuf[15] = ibuf[15] ^ ip[15];
                i += AES_BLOCK_SIZE;
                ip += AES_BLOCK_SIZE;
                ibuf += AES_BLOCK_SIZE;
                obuf += AES_BLOCK_SIZE;
            }

        while(i++ < blen)
            *obuf++ = *ibuf++ ^ ip[b_pos++];
    }
    ctx->inf.b[2] = (uint_8t)b_pos;
    return EXIT_SUCCESS;
}
if(b_位置)
{
memcpy(buf、cbuf、AES_块大小);
如果(aes\u ecb\u加密(buf,buf,aes\u块大小,ctx)!=退出成功)
返回退出失败;
while(b_posinf.b[2]);
单位长度(单位长度);
如果(b_位置)
{
memcpy(buf、cbuf、AES_块大小);
如果(aes\u ecb\u加密(buf,buf,aes\u块大小,ctx)!=退出成功)
返回退出失败;
while(b_posBFR_长度?BFR_长度:len),len-=blen;
对于(i=0,ip=buf;i<(blen>>4);+i)
{
memcpy(ip、cbuf、AES块大小);
ctr_公司(cbuf);
ip+=AES_块大小;
}
如果(混合和(AES块大小-1))
memcpy(ip、cbuf、AES_块大小),i++;
如果(aes\u ecb\u加密(buf,buf,i*aes\u块大小,ctx)!=退出成功)
返回退出失败;
i=0;ip=buf;
而(i+AES_块大小inf.b[2]=(uint_8t)b_pos;
返回退出成功;
}

CTR模式使AES像流密码一样工作。加密和解密时,数据长度没有限制,特别是在块对齐方面(与其他模式一样,如CBC)

函数
aes\u ctr\u crypt()
确实可以使用任意长度的输入数据(
ibuf
)调用

问题在于,对于每次调用,函数都需要记住前一次调用中的两件事:

  • 当前计数器块的值(即参数
    cbuf
  • 到目前为止,它在当前计数器块中消耗了多少字节(这是保存在参数
    ctx
    中并复制到局部变量
    b_pos
    中的信息)
  • 因此,
    b_pos
    是键流模16中的位置


    换句话说,当函数在不消耗最后一个计数器块中的所有16字节的情况下完成对某一数据段的加密时,它会给
    b_pos
    留下一个值
    0非常好的解释!计数器在哪里初始化?IV应该发送到接收器,以便他们可以使用它来解密消息。正如我所理解的等等,它通常与密文一起发送。如何发送到这里?我认为这取决于您的应用程序分配一个初始化第一个计数器块。它通常包含一个随机的nonce(您的应用程序必须以某种方式发送给接收方)和一个初始计数器(通常为0)。查看NIST 800-38A了解完整的详细信息。我有[link]()对于流密码,keystream是使用明文(加密时)或密文(解密时)异或的数据。对于CTR模式,每次加密计数器时,您都会得到密钥流的下16个字节。换句话说,当您加密长度为N字节的数据时,您使用长度为N字节的密钥流。Message0和Message1是相同大消息的不同块。CTR允许将大消息拆分为任意大小的块。TransmTILE和接收器不需要在这些协议上达成一致,不需要交换位置,只要块没有重新排序。如果一个块的最后一个字节位于计数器块的中间(例如BPoPs==8),则要处理的下一个块的第一个字节必须在位置ByPOS==9的情况下与密钥流字节进行XOR。
    
    (b_pos < AES_BLOCK_SIZE) && len