- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我将样本输入作为 p=61,q=53,并且如果我为这个特定的素数集提供一个介于 1 和 21 之间的消息值,我的程序会成功地将消息加密和解密为正确的原始消息。但是,如果我将输入作为 p=61、q=53 并且消息值大于 21,则无法将消息解密回正确的原始消息。
而且不仅仅是这些特定的素数集。对于任何一对素数,只有一定范围的消息值才能正确加密和解密。那是为什么呢?谁能建议如何解决这个问题?
class RSA
{
private:
long int p,q;
long int msg,cipherMsg,plainMsg;
long int n,totient;
long int publicKey,privateKey;
public:
RSA();
void ComputeKeys(long int p1,long int p2,long long int message);
void EncryptMessage();
void DecryptMessage();
};
RSA :: RSA()
{
p=0;q=0;
n=0;totient=0;
publicKey=0;privateKey=0;
msg=0;cipherMsg=0;plainMsg=0;
}
void RSA :: EncryptMessage()
{
int y=1;
cout<<"Encrypting Message....."<<endl;
for(long int i=1;i<=publicKey;i++)
{
y=y*msg;
}
msg=y;
cout<<"m^e:"<<msg<<endl;
cipherMsg= msg%n;
cout<<"Encryption Complete!"<<endl;
cout<<"Cipher Message:"<<cipherMsg<<endl;
}
void RSA :: DecryptMessage()
{
long int y= 1,tmp;
cout<<"Decrypting Message...."<<endl;
for(long int i=1;i<=privateKey;i++)
{
y=y*cipherMsg;
tmp=y;
y=fmod(y,n);
}
cout<<"c^d:"<<tmp<<endl;
plainMsg=y;
cout<<"Decryption Complete!"<<endl;
cout<<"Original Message:"<<plainMsg<<endl;
}
int main()
{
RSA obj;
cout<<"\t------RSA Cryptography------"<<endl;
obj.ComputeKeys(61,53,21);
return 0;
}
(请注意,出于专有原因,我没有发布我的 ComputeKeys()
方法。但我相信我需要在此处进行修改。)
最佳答案
对我来说,它看起来像是整数溢出。现在,您正在计算 xy,并且仅当您完成后,才对该结果进行模 m。
您通常希望利用这样一个事实,即您可以在沿途的每一步取模,以最小化避免溢出所需的大小。
模块化幂函数的代码看起来像这样:
template <class T>
T mul_mod(T a, T b, T m) {
if (m == 0) return a * b;
T r = T();
while (a > 0) {
if (a & 1)
if ((r += b) > m) r %= m;
a >>= 1;
if ((b <<= 1) > m) b %= m;
}
return r;
}
template <class T>
T pow_mod(T a, T n, T m) {
T r = 1;
while (n > 0) {
if (n & 1)
r = mul_mod(r, a, m);
a = mul_mod(a, a, m);
n >>= 1;
}
return r;
}
根据您使用的类型和值,这个可能仍然会溢出,但是对于给定的类型,它会为比天真的值多的值产生正确的结果版本。
另请注意,这会通过重复平方来求幂,这使得它在处理更大的数字时更加实用(基本上,它是 O(log N) 而不是 O(N),N=模数)。
我在 another answer 中发布了一个更完整的实现.
关于c++ - RSA 程序只能加密和解密特定范围内的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34302999/
有一条(相对)众所周知的 Perl 公理:“只有 Perl 可以解析 Perl”。我想知道 Perl 6 是否仍然如此? 扩大讨论...考虑到 PyPy 最近的更新,我想到了这个问题。 Perl 独特
这是设置。在上一个问题中,我发现我可以通过子组件中的状态传递对象属性,然后使用 componentDidUpdate 获取该对象属性。在这种情况下,状态和属性都称为到达。 这是基本代码... expo
我运行的是 10.5.2 社区版。我已经标记了 源/主要/资源 作为源目录。我可以右键单击并“编译”某些文件,据我所知,这意味着 IDE 将文件复制到与发送类文件的“com.mydomain.pack
我是一名优秀的程序员,十分优秀!