RSA过程中避免pow和mod溢出的C算法

RSA过程中避免pow和mod溢出的C算法,c,encryption,integer-overflow,C,Encryption,Integer Overflow,我正在进行RSA加密和解密,在尝试pow(ascii,e)%c时遇到了溢出问题 我尝试了另一种方法,那就是将ascii本身乘以e倍,然后每次乘以mod c。这应该给我一个int或long可以容纳的东西。但是,我没有得到正确的加密数字 我正在尝试加密字符串Hello。预期输出应为 1148 326 1145 1145 1780 但是我越来越 1343 1450 379 379 855 这就是我所拥有的 int main(int argc, const char *argv[]) {

我正在进行RSA加密和解密,在尝试
pow(ascii,e)%c
时遇到了溢出问题

我尝试了另一种方法,那就是将
ascii
本身乘以
e
倍,然后每次乘以
mod c
。这应该给我一个
int
long
可以容纳的东西。但是,我没有得到正确的加密数字

我正在尝试加密字符串
Hello
。预期输出应为

1148 326 1145 1145 1780 
但是我越来越

1343 1450 379 379 855 
这就是我所拥有的

int main(int argc, const char *argv[]) {
   char buff[128];
   strncpy(buff, "Hello\n",6);

   int n = 0;
   while(buff[n] != '\n') {
      int i;
      int ascii = (int)buff[n];
      int en = ascii;

      int e = 451; // example
      int c = 2623; // example
      // instead of raising to power of e, multiply by itself e times
      // then mod c each time
      for (i = 0; i < e; i++) {
         en = (en * ascii) % c;
      }
      fprintf(stdout, "%d ", en);

      n++;
   }
   fprintf(stdout, "\n");

   return 0;
}
int main(int argc,const char*argv[]{
字符buff[128];
strncpy(buff,“Hello\n”,6);
int n=0;
而(buff[n]!='\n'){
int i;
int ascii=(int)buff[n];
int-en=ascii;
int e=451;//示例
int c=2623;//示例
//与其提高到e的幂,不如将其自身乘以e倍
//然后每次修改c
对于(i=0;i
循环应运行
e-1
次。因为在第一次迭代中,您将得到平方,以此类推……

int en=ascii//这里有一个bug,en=1

您需要循环
e-1
次,而不是
e
次。请注意,第一个循环过程将找到正方形。至于
pow()
函数,您可能最好避免使用浮点类型的函数。我担心您自己也在尝试RSA。获取弱密钥的方法太多了。实际上,我刚刚开始学习C语言的网络编程,所以这只是我要熟悉的东西。如果PTN适合任何小于BigInteger的东西,则保证为弱密钥。但是,如果只是为了获得理解而进行的练习,他也几乎可以保证增加自己的知识。@PTN其他人已经为你的问题提供了一个很好的解决方案,所以这篇评论不是直接针对这一点的。然而,为了帮助你学习,如果你看一下维基百科关于模幂运算的页面,你会发现你发现了他们在那里描述的节省内存的方法。但是如果你再往下看,你会看到从右到左的二进制方法。如果你不理解,忽略求和符号;伪代码是最主要的。如果你有非常大的指数,这是一个很好的了解。如果你感兴趣的话。