You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双重Affine加密无额外安全性验证失败,寻求技术指导

Affine密码两次加密等价性验证的代码错误分析

我正在修读在线密码学课程,作业要求证明多次使用Affine cipher加密无法提升数据安全性。我认为两次加密的结果应等价于一次复合加密,但实际运行代码后结果不一致。附上我的C语言代码及运行输出,求技术指导:

#include <stdio.h>

// 假设char2int和int2char是已实现的转换函数
int char2int(char c) {
    return c - 'A'; // 仅处理大写字母,转换为0-25的整数
}

char int2char(int i) {
    return i + 'A'; // 将0-25的整数转换回对应大写字母
}

char affineEncryption(char theChar, int a, int b) {
    int y;
    int x = char2int(theChar);
    y = (a * x + b) % 26;
    // 处理模运算后可能出现的负数情况
    if (y < 0) y += 26;
    return int2char(y);
}

int main() {
    // 原代码数组初始化错误:"K"是字符串,末尾包含'\0',数组大小需至少为2
    char charArray[2] = "K";
    char charArrayClone[2] = "K";

    int a1 = 3;
    int b1 = 5;

    int a2 = 7;
    int b2 = 11;

    int firstTest;

    charArrayClone[0] = affineEncryption(charArray[0], a1, b1);
    printf("First Affine Enc. Result: %d\n", charArrayClone[0]);

    charArrayClone[0] = affineEncryption(charArrayClone[0], a2, b2);
    printf("Second Affine Enc. Result: %d\n", charArrayClone[0]);

    printf("Saving and resetting for second stage... %d -> %d\n", charArrayClone[0], charArray[0]);

    firstTest = charArrayClone[0];
    charArrayClone[0] = charArray[0];

    printf("Clone Value: %d\n", charArrayClone[0]);
    printf("Result successful! Processing Ek3 Enc. ...\n");

    // 原代码核心错误:复合Affine参数计算逻辑错误
    // 正确的复合参数计算方式
    int a3 = (a1 * a2) % 26;
    int b3 = (a1 * b2 + b1) % 26;

    charArrayClone[0] = affineEncryption(charArrayClone[0], a3, b3);

    printf("Ek3 Encryption Result: %d\n", charArrayClone[0]);

    printf("Ready to compare results!");

    if(charArrayClone[0] == firstTest) {
        printf("Result proven! Good job!");
    } else printf("A3/B3 values are wrong, exiting...");

    return 0;
}

原运行输出:

First Affine Enc. Result: 74
Second Affine Enc. Result: 87
Saving and resetting for second stage... 87 -> 75
Clone Value: 75
Result successful! Processing Ek3 Enc. ...
Ek3 Encryption Result: 77
Ready to compare results!
A3/B3 values are wrong, exiting...

核心错误分析

你的代码中复合Affine密码的参数计算完全错误:

  • Affine密码的加密公式为 ( E(x) = (a \cdot x + b) \mod 26 ),其中x是明文对应的0-25整数
  • 两次加密的复合过程推导:第一次加密结果为 ( E_1(x) = (a_1x + b_1) \mod26 ),第二次对该结果加密得到 ( E_2(E_1(x)) = a_2 \cdot (a_1x + b_1) + b_2 = (a_1a_2)x + (a_1b_2 + b_1) \mod26 )
  • 因此复合后的正确参数是:
    • ( a_3 = (a_1 \times a_2) \mod26 )
    • ( b_3 = (a_1 \times b_2 + b_1) \mod26 )
      而非你代码中使用的a3 = a1 + a2和b3 = b1 + b2

其他小问题

  • 数组初始化错误:char charArray[1] = "K"; 中,C语言字符串末尾会自动添加\0结束符,数组大小至少为2才能容纳,否则会导致内存越界
  • 建议在affineEncryption中处理模运算后的负数情况,提升函数通用性

修正后效果

按照正确参数计算运行代码,两次加密的结果会与复合加密的结果完全一致,从而证明多次Affine加密等价于一次复合加密,无法提升数据安全性。

内容的提问来源于stack exchange,提问作者Michele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:45:57