【问题标题】:Speck cipher implementation in C - Test vector ErrorC 中的 Speck 密码实现 - 测试向量错误
【发布时间】:2018-03-11 04:42:54
【问题描述】:

我在 C 中实现了 SPECK 密码 64/96。

我认为加密和解密运行良好。

但是,当我检查论文中的测试向量时,我的实现是错误的。 (这篇论文是The Simon and Speck Families of Lightweight Block Ciphers——它可能还有其他来源。) 我不知道我哪里错了。

我错过了什么?

我的实现是:

#define ROR(x, r) ((x >> r) | (x << (32-r)))
#define ROL(x, r) ((x << r) | (x >> (32-r)))
#define ROUNDS 26
#define u32 unsigned int

void Speck64Encrypt(u32 ct[], const u32 pt[], const u32 K[]){

    u32 i;
    u32 L[ROUNDS + 1] = { 0, };
    u32 RK[ROUNDS] = { 0, };

    RK[0] = K[0];
    L[0] = K[1];
    L[1] = K[2];

    for (i = 0; i < ROUNDS - 1; i++)
    {
        L[i + 2] = (RK[i] + ROR(L[i], 8)) ^ i;
        RK[i + 1] = ROL(RK[i], 3) ^ L[i + 2];
    } // Round Key Generation!!!

    ct[0] = pt[0];
    ct[1] = pt[1];

    for (i = 0; i < ROUNDS; i++)
    {
        ct[1] = (ROR(ct[1], 8) + ct[0]) ^ RK[i];
        ct[0] = ROL(ct[0], 3) ^ ct[1];
    }
}

int main()
{
    u32 k[3] = { 0x13121110, 0x0b0a0908, 0x03020100 };
    u32 pt[2] = { 0x74614620, 0x736e6165 };
    u32 ct[2] = {0, };

    Speck64Encrypt(ct, pt, k);
    printf("Expect : 0x9f7952ec, 0x4175946c\n");
    printf("Result : %08x, %08x \n", ct[0], ct[1]);

    return 0;
}

【问题讨论】:

  • “我错过了什么?”你有 16 位的 `unsigned 吗?
  • 我发现了我的问题。我的问题是 testvector 的顺序... T.T 谢谢!!!改变顺序,则testvector为:u32 k[3] = { 0x03020100, 0x0b0a0908, 0x13121110 }; u32 pt[2] = { 0x736e6165, 0x74614620 };我可以确认!!

标签: c


【解决方案1】:

你输入了key的单词和明文的倒序。你应该有 K0=03020100, K1=0b0a0908, K2=13121110。另外,pt1=74614620,pt0=736e6165。

【讨论】:

  • 在您回答前 11 小时,Hoo 在 cmets 中发布了同样的信息:我发现了我的问题。我的问题是 testvector 的顺序... T.T 谢谢!!!换个顺序,那么testvector就是:u32 k[3] = { 0x03020100, 0x0b0a0908, 0x13121110 };u32 pt[2] = { 0x736e6165, 0x74614620 };
  • @sg7 坦率的回答不应该写在 cmets 部分,即使是作者也不应该写,因为很容易错过/忽略它们(特别是如果它们被隐藏了)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2018-05-22
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多