自己做的AES-ECB加密解密,有些问题想请教一下

2019-07-20 20:00发布

手头的事情要给数据进行加密,我用的是AES-ECB加密方式。
现在程序中加密已经调试好了,能用串口显示出来。
但是解密上遇到以下几个问题:
一、串口调试助手能显示出原来的明文,但是明文之后还有一长串不知名的数据不知道从哪来的
二、烧好程序后需要等待一段时间(30S左右)调试程序才能显示出数据
希望各位大大们帮我看看啊,小弟不胜感激。
程序在下面。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
cp9559
2019-07-20 22:48
这是算法
#include "aes.h"

#define F(x)   (((x)<<1) ^ ((((x)>>7) & 1) * 0x1b))
#define FD(x)  (((x) >> 1) ^ (((x) & 1) ? 0x8d : 0))

/* -------------------------------------------------------------------------- */
uchar8_t gf_alog(uchar8_t x) // calculate anti-logarithm gen 3
{
    uchar8_t atb = 1, z;

    while (x--) {z = atb; atb <<= 1; if (z & 0x80) atb^= 0x1b; atb ^= z;}

    return atb;
} /* gf_alog */

/* -------------------------------------------------------------------------- */
uchar8_t gf_log(uchar8_t x) // calculate logarithm gen 3
{
    uchar8_t atb = 1, i = 0, z;

    do {
        if (atb == x) break;
        z = atb; atb <<= 1; if (z & 0x80) atb^= 0x1b; atb ^= z;
    } while (++i > 0);

    return i;
} /* gf_log */


/* -------------------------------------------------------------------------- */
uchar8_t gf_mulinv(uchar8_t x) // calculate multiplicative inverse
{
    return (x) ? gf_alog(255 - gf_log(x)) : 0;
} /* gf_mulinv */

/* -------------------------------------------------------------------------- */
uchar8_t rj_sbox(uchar8_t x)
{
    uchar8_t y, sb;

    sb = y = gf_mulinv(x);
    y = (y<<1)|(y>>7); sb ^= y;  y = (y<<1)|(y>>7); sb ^= y;
    y = (y<<1)|(y>>7); sb ^= y;  y = (y<<1)|(y>>7); sb ^= y;

    return (sb ^ 0x63);
} /* rj_sbox */

/* -------------------------------------------------------------------------- */
uchar8_t rj_xtime(uchar8_t x)
{
    return (x & 0x80) ? ((x << 1) ^ 0x1b) : (x << 1);
} /* rj_xtime */


/* -------------------------------------------------------------------------- */
void aes_subBytes(uchar8_t *buf)
{
    register uchar8_t i = 16;
    while (i--) buf[i] = rj_sbox(buf[i]);
} /* 字节替代变换 */

/* -------------------------------------------------------------------------- */
void aes_subBytes_inv(uchar8_t *buf)
{
    register uchar8_t i = 16, j;
    while (i--)
    {
        j = 0; do { if (rj_sbox(j) == buf[i]) {buf[i] = j; break;} } while (++j);
    }
} /* 字节替代逆变换 */

/* -------------------------------------------------------------------------- */
void aes_addRoundKey(uchar8_t *buf, uchar8_t *key)
{
    register uchar8_t i = 16;
    while (i--) buf[i] ^= key[i];
} /* 子密钥加 */

/* -------------------------------------------------------------------------- */
void aes_addRoundKey_cpy(uchar8_t *buf, uchar8_t *key, uchar8_t *cpk)
{
    register uchar8_t i = 16;
    while (i--)  buf[i] ^= (cpk[i] = key[i]), cpk[16+i] = key[16 + i];
} /* 逆子密钥加 */


/* -------------------------------------------------------------------------- */
void aes_shiftRows(uchar8_t *buf)
{
    register uchar8_t i, j; /* to make it potentially parallelable */

    i = buf[1]; buf[1] = buf[5]; buf[5] = buf[9]; buf[9] = buf[13]; buf[13] = i;
    i = buf[10]; buf[10] = buf[2]; buf[2] = i;
    j = buf[3]; buf[3] = buf[15]; buf[15] = buf[11]; buf[11] = buf[7]; buf[7] = j;
    j = buf[14]; buf[14] = buf[6]; buf[6]  = j;

} /* 移位变换 */

/* -------------------------------------------------------------------------- */
void aes_shiftRows_inv(uchar8_t *buf)
{
    register uchar8_t i, j; /* same as above */

    i = buf[1]; buf[1] = buf[13]; buf[13] = buf[9]; buf[9] = buf[5]; buf[5] = i;
    i = buf[2]; buf[2] = buf[10]; buf[10] = i;
    j = buf[3]; buf[3] = buf[7]; buf[7] = buf[11]; buf[11] = buf[15]; buf[15] = j;
    j = buf[6]; buf[6] = buf[14]; buf[14] = j;

} /* 逆移位变换 */

/* -------------------------------------------------------------------------- */
void aes_mixColumns(uchar8_t *buf)
{
    register uchar8_t i, a, b, c, d, e;

    for (i = 0; i < 16; i += 4)
    {
        a = buf[i]; b = buf[i + 1]; c = buf[i + 2]; d = buf[i + 3];
        e = a ^ b ^ c ^ d;
        buf[i] ^= e ^ rj_xtime(a^b);   buf[i+1] ^= e ^ rj_xtime(b^c);
        buf[i+2] ^= e ^ rj_xtime(c^d); buf[i+3] ^= e ^ rj_xtime(d^a);
    }
} /* 列混合变换 */

/* -------------------------------------------------------------------------- */
void aes_mixColumns_inv(uchar8_t *buf)
{
    register uchar8_t i, a, b, c, d, e, x, y, z;

    for (i = 0; i < 16; i += 4)
    {
        a = buf[i]; b = buf[i + 1]; c = buf[i + 2]; d = buf[i + 3];
        e = a ^ b ^ c ^ d;
        z = rj_xtime(e);
        x = e ^ rj_xtime(rj_xtime(z^a^c));  y = e ^ rj_xtime(rj_xtime(z^b^d));
        buf[i] ^= x ^ rj_xtime(a^b);   buf[i+1] ^= y ^ rj_xtime(b^c);
        buf[i+2] ^= x ^ rj_xtime(c^d); buf[i+3] ^= y ^ rj_xtime(d^a);
    }
} /* 逆列混合变换 */

/* -------------------------------------------------------------------------- */
void aes_expandEncKey(uchar8_t *k, uchar8_t *rc)
{
    register uchar8_t i;

    k[0] ^= rj_sbox(k[29]) ^ (*rc);
    k[1] ^= rj_sbox(k[30]);
    k[2] ^= rj_sbox(k[31]);
    k[3] ^= rj_sbox(k[28]);
    *rc = F( *rc);

    for(i = 4; i < 16; i += 4)  k[i] ^= k[i-4],   k[i+1] ^= k[i-3],
                                k[i+2] ^= k[i-2], k[i+3] ^= k[i-1];
    k[16] ^= rj_sbox(k[12]);
    k[17] ^= rj_sbox(k[13]);
    k[18] ^= rj_sbox(k[14]);
    k[19] ^= rj_sbox(k[15]);

    for(i = 20; i < 32; i += 4) k[i] ^= k[i-4],   k[i+1] ^= k[i-3],
                                k[i+2] ^= k[i-2], k[i+3] ^= k[i-1];

} /* 扩展子密钥 */

/* -------------------------------------------------------------------------- */
void aes_expandDecKey(uchar8_t *k, uchar8_t *rc)
{
    uchar8_t i;

    for(i = 28; i > 16; i -= 4) k[i+0] ^= k[i-4], k[i+1] ^= k[i-3],
                                k[i+2] ^= k[i-2], k[i+3] ^= k[i-1];

    k[16] ^= rj_sbox(k[12]);
    k[17] ^= rj_sbox(k[13]);
    k[18] ^= rj_sbox(k[14]);
    k[19] ^= rj_sbox(k[15]);

    for(i = 12; i > 0; i -= 4)  k[i+0] ^= k[i-4], k[i+1] ^= k[i-3],
                                k[i+2] ^= k[i-2], k[i+3] ^= k[i-1];

    *rc = FD(*rc);
    k[0] ^= rj_sbox(k[29]) ^ (*rc);
    k[1] ^= rj_sbox(k[30]);
    k[2] ^= rj_sbox(k[31]);
    k[3] ^= rj_sbox(k[28]);
} /* 扩展逆子密钥 */


/* -------------------------------------------------------------------------- */
void aes_init(aes_context *ctx, uchar8_t *k)
{
    uchar8_t rcon = 1;
    register uchar8_t i;
    for (i = 0; i < sizeof(ctx->key); i++) ctx->enckey[i] = ctx->deckey[i] = k[i];
    for (i = 8;--i;) aes_expandEncKey(ctx->deckey, &rcon);
} /* 初始化,对称密钥 */

/* -------------------------------------------------------------------------- */
void aes_done(aes_context *ctx)
{
    register uchar8_t i;
    for (i = 0; i < sizeof(ctx->key); i++)
        ctx->key[i] = ctx->enckey[i] = ctx->deckey[i] = 0;
} /* 清空密钥 */

/* -------------------------------------------------------------------------- */
void aes_encrypt_ecb(aes_context *ctx, uchar8_t *buf)
{
    uchar8_t i, rcon;

    aes_addRoundKey_cpy(buf, ctx->enckey, ctx->key);
    for(i = 1, rcon = 1; i < 14; ++i)
    {
        aes_subBytes(buf);
        aes_shiftRows(buf);
        aes_mixColumns(buf);
        if( i & 1 ) aes_addRoundKey( buf, &ctx->key[16]);
        else aes_expandEncKey(ctx->key, &rcon), aes_addRoundKey(buf, ctx->key);
    }
    aes_subBytes(buf);
    aes_shiftRows(buf);
    aes_expandEncKey(ctx->key, &rcon);
    aes_addRoundKey(buf, ctx->key);
} /* 加密 */

/* -------------------------------------------------------------------------- */
void aes_decrypt_ecb(aes_context *ctx, uchar8_t *buf)
{
    uchar8_t i, rcon;

    aes_addRoundKey_cpy(buf, ctx->deckey, ctx->key);
    aes_shiftRows_inv(buf);
    aes_subBytes_inv(buf);

    for (i = 14, rcon = 0x80; --i;)
    {
        if( ( i & 1 ) )           
        {
            aes_expandDecKey(ctx->key, &rcon);
            aes_addRoundKey(buf, &ctx->key[16]);
        }
        else aes_addRoundKey(buf, ctx->key);
        aes_mixColumns_inv(buf);
        aes_shiftRows_inv(buf);
        aes_subBytes_inv(buf);
    }
    aes_addRoundKey( buf, ctx->key);
} /* 解密 */

一周热门 更多>