目前正在尝试在 C++ 中实现 RSA 加密,但遇到了加密消息的问题。
如果我们取 p = 2、q = 7,则 N = 14 且 phi = 6。e 被迫为 5,d 可以是各种数字,但让我们从列表 d = 11 中取出第一个适用的数字。现在假设要加密的 asccii 消息是“b”。
b 在 asccii 中是 98,如果我们用 e = 5、N = 14 加密,那么 98^5 mod(14) = 0 得到的加密消息是 0。现在,如果我们尝试用 d = 11 或任何 d 进行解密没关系,0^d mod14 = 0 表明原始消息是 0 或 NULL,这是不正确的。
如何解决这个问题,以便可以加密和解密任何消息而不丢失 M^5 mod14 为 0 的字符?
在代码中,我们获取已经加密的数据并将其转换为 asccii 值的向量:
#define ull unsigned long long int
void dataToAscii() {
asciiVec = {};
for (wchar_t c: dataString) {
asciiVec.push_back((ull) c);
}
}
然后调用解密
void decrypt(){
std::vector<ull> decrypted;
for (int i=0;i<= this->asciiVec.size()-1;i++) {
decrypted.push_back(modPow((ull)this->asciiVec.at(i), (ull)privateKey.at(0), (ull)privateKey.at(1)));
}
deAsciiVec = decrypted;
deAscciiToData();
}
void deAscciiToData() {
deDataString = "";
for (ull el:deAsciiVec) {
deDataString.push_back((wchar_t) el);
}
}
但我认为问题不在于代码,而在于 M^e mod(N) = 0 时所示的数学
正如 @President James K. Polk 评论的那样,
对于 RSA,明文必须小于模数。并且不要使用 p=2,仅使用奇素数。