现在的位置: 首页 > 综合 > 正文

c/c++中大数的处理——菜鸟发帖

2013年10月11日 ⁄ 综合 ⁄ 共 1365字 ⁄ 字号 评论关闭
        最近在做RSA算法的实现,算法本身不是很难,RSA算法本身十分简洁。但是比较纠结于大数的处理,例如RSA的密钥需要2048bits.
    在c或者c++中实现大数的运算时比较浪费资源的。我们用数组来储存的话,一个空间储存一个bit,这是比较浪费的,因为就算是char型的数据也是8bits.也就是说没用到一个bit就会浪费8bits的空间,如果是2048bits……
    目前我还没有找到更好的方法。但是如果是在汇编中就好办的多,最起码不会浪费空间,如果是在汇编中就直接定义:
        array db 2048 dup(0)
    在c中就是
        char buffer[2048];
    空间代价不可谓不大。
 
 
    空间代价在当前内存暂时不计。然后就是要考虑输入输出的问题。不论是在cmd shell的方式下还是windows界面的方式下,不论是对于一大串数据的输入还是从文件接收数据,最简单的还是用string来接受和输出(用puts和gets)义为一个类:
 
class BIG_INT          //大整数类
{
public:
 char buff[SIZE];
 int buff_length;
 BIG_INT()
 {
  buff_length=0;
  int i=0;
  for(i;i<SIZE;i++)
   buff[i]='0';
 }
 BIG_INT assign(char temp[])
 {
  int i=0;
  for(i;(i<SIZE)&&(temp[i]!='/0');i++)
   buff[i]=temp[i];
 }
};
 
    所以我们需要两个函数:
        char* transfer_I_C(BIG_INT a,int s_l);
        //转换函数,将运算完毕的BIG_INT型数据转换为string,方便输出
        BIG_INT transfer_C_I(char a[],int s_l);
        //转换函数,将接收到的字符串型数据转换为BIG_INT类型
    (ps:这是目前的做法,关于这两个函数我会尝试重载,根据返回值和参数的不同在c++中尝试重载。这个转换非常必要,还会把char型的ASCII值转换为可以直接运算的整数型)
 
 
     嗯,转换完了,然后就是内部的运算了,运算还是需要自己定义,不论是+、-、*、/还是其他的。感觉比较麻烦。但是还得做。在c++中可以方便的运用运算符重载
BIG_INT operator+(BIG_INT x,BIG_INT y)//大整数+
{
 
}
呵呵,需要见一个test工作空间测试一下,结果差强人意。^_^
test:
int main(void)
{
 int l;
 BIG_INT x;
 BIG_INT y;
 char *m;
 m=(char*)malloc(SIZE*sizeof(char));
 gets(m);
 l=strlen(m);
    x=transfer_C_I(m,l);
 gets(m);
 l=strlen(m);
 y=transfer_C_I(m,l);
 x=x+y;
 m=transfer_I_C(x,l);
 puts(m);
 return 0;
}
测试截图:       
                       
 

抱歉!评论已关闭.