最近在做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];
}
};
{
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型数据转换为string,方便输出
BIG_INT transfer_C_I(char a[],int s_l);
//转换函数,将接收到的字符串型数据转换为BIG_INT类型
//转换函数,将接收到的字符串型数据转换为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;
}
{
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;
}
测试截图: