双重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
相关产品推荐
相关产品推荐

