加密算法中涉及C/C++总结

学习网站:http://www.runoob.com/cplusplus/cpp-functions.html

char在VC(c++)中占1字节(byte),8位(bit)。

int在VC(c++)中占4字节(4byte),32位(32bit)。

 一、相关函数摘要

1、srand( (unsigned) time( &t ) )

随机函数srand()函数产生一个以当前时间开始的随机种子

2、time( &t )

获取time_t类型的当前时间

3、 clock()

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数。

4、FILE *fopen(const char *filename, const char *mode) ;

使用给定的模式 mode 打开 filename 所指向的文件

  • filename -- 这是 C 字符串,包含了要打开的文件名称。
  • mode -- 这是 C 字符串,包含了文件访问模式,模式如下:
模式描述
"r"打开一个用于读取的文件。该文件必须存在。
"w"创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
"a"追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
"r+"打开一个用于更新的文件,可读取也可写入。该文件必须存在。
"w+"创建一个用于读写的空文件。
"a+"打开一个用于读取和追加的文件。

 该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。

5、size_t fread(void  *ptr ,  size_t  size ,  size_t  nmemb ,  FILE   *stream);

从给定流 stream 读取数据到 ptr 所指向的数组中

  • ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
  • size -- 这是要读取的每个元素的大小,以字节为单位。
  • nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。

成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。

6、char *strcat(char *dest, const char *src)

 src 所指向的字符串追加到 dest 所指向的字符串的结尾

 

  • dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
  • src -- 指向要追加的字符串,该字符串不会覆盖目标字符串。

该函数返回一个指向最终的目标字符串 dest 的指针。

7、 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 

 ptr 所指向的数组中的数据写入到给定流 stream 中;把ptr所指向的nmemb*size个字节输出到stream所指向的文件中。

  • ptr -- 这是指向要被写入的元素数组的指针。
  • size -- 这是要被写入的每个元素的大小,以字节为单位。
  • nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。

返回写到stream文件总的数据项个数。

8int fclose(FILE *stream)

关闭stream所指文件,释放文件缓冲区

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了要被关闭的流。

出错返回非0,否则返回0。

9、int feof(FILE *stream)

测试给定流 stream 的文件结束标识符;检查文件是否结束。

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

遇到文件结束符返回非零值,否者返回0。

二、ECC代码中调用的大数库(tommath)函数总结

1、mp_int a

mp_digit是无符号整数;dp是存放大整数的地址;used为实际使用的mp_digit单元;sign=0,表示非负数;=1表示负数。

2.   mp_init

初始化mp_int结构,函数返回MP_OKAY,就可以认为该结构已正确初始化,可以安全的被库中其他函数使用

3. mp_init_set_int

初始化mp_int结构并设置大常量。它接受一个“长”数据类型作为输入,并且总是将其当作一个32位整数。

输入一个mp_int类型的和一个“长”整型b,输出a等于b。

4.mp_init_set

其中b是一个数据位。

初始化mp_int结构并设置小常量。例如将mp_int结构设置成一个相对较小的值(1或2等)。

 5. mp_toradix

函数原型为int mp_toradix(mp_int *a, char *str, int radix)

此算法计算mp_int类型的a的以r为基的表示法,并把数位存在数组temp(char型)中并以字符串形式输出到屏幕上。

6. mp_prime_random_ex

函数原型为int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat);

*dat一般可设置为NULL。

求一定位数的素数

a为返回值,t为回测次数,通常可为10,size指产生的素数的位数

7.mp_expt_d

函数原型为int mp_expt_d(mp_int *a, mp_digit b, mp_int *c)

此算法计算a的b次幂,其中b为单数位数字。

8. mp_sqr

函数原型为int mp_sqr(mp_int *a, mp_int *b)

输入mp_int类型的a,输出b=a^2.分配了一个临时mp_int b来保存平方结果。

9.mp_sqrt

函数原型为int mp_sqrt(mp_int *arg, mp_int *ret);

此算法为开平方根算法。

10.mp_mul_d

函数原型为int mp_mul_d(mp_int *a, mp_digit b, mp_int *c)

单数位乘法。此算法快速计算mp_int与单数位值的乘积。输入mp_int a和mp_digit b,输出c=ab

11.mp_mul

函数原型为int mp_mul(mp_int *a, mp_int *b, mp_int *c);

计算两个数的有符号乘积。返回结果为目标操作数c=ab。

12.mp_add

函数原型为int mp_add(mp_int *a, mp_int *b, mp_int *c)

输入两个mp_int类型的a和b,输出有符号加法c=a+b。

13.mp_sub

函数原型为int mp_sub(mp_int *a, mp_int *b, mp_int *c);

输入两个mp_int类型的a和b,输出有符号加法c=a-b。

14.mp_mod

函数原型为int mp_mod(mp_int *a, mp_int *b, mp_int *c)

输入两个mp_int类型的a和b ,输出c=a mod b, 0 <= c < b

15.mp_cmp

函数原型为int mp_cmp(mp_int *a, mp_int *b)

有符号数的比较。输入两个mp_int类型的a和b,输出有符号数比较结果(a在b的左边)

函数返回值为MP_GT=1时为大于;MP_EQ=0时为等于;MP_LT=-1时为小于。

16.mp_clear

函数原型为void mp_clear(mp_int *a);

输入:mp_int类型的变量a,输出:回收为a分配的内存。

17.mp_copy

函数原型为int mp_copy(mp_int *a, mp_int *b);

b = a,该算法拷贝了mp_int结构a,算法成功终止时,mp_int结构b就和a代表同一个整数值。mp_int结构b是结构a的完整但不同的拷贝,mp_int结构a可以修改并且不会影响mp_int结构b的值。

18.mp_init_copy

函数原型:int mp_init_copy(mp_int *a, mp_int *b);

初始化mp_int结构a,并将b拷贝到a 。

19. mp_zero

函数原型为void mp_zero(mp_int *a);

输入mp_int 类型的a,并将a的内容清零。

20.mp_invmod

函数原型为int mp_invmod(mp_int *a, mp_int *b, mp_int *c);

c = 1/a (mod b)

输入mp_int a和b,(a,b)=1,p>=2,0<a<p,输出模逆c=a^-1(mod b)。即ab=1(mod p)

21.mp_mulmod

函数原型为int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);

此算法求解 d = a * b (mod c)

22. mp_submod

函数原型为int mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);

 此算法求解 d = a - b (mod c)

 

 

转载自:http://blog.csdn.net/wjj1987/article/details/6409469

 

转载于:https://www.cnblogs.com/smy87/p/7919522.html

md5 用c++实现md5算法. 开发平台 Ubuntu14.04 运行 sudo get-apt install g++ make ./md5_test md5简介 消息摘要算法第五版(英语:Message-Digest Algorithm 5,缩写为MD5),是当前计算机领域用于确保信息传输完整一致而广泛使用的散列算法之一(又译哈希算法、摘要算法等),主流编程语言普遍已有MD5的实现。将数据 (如一段文字)运算变为另一固定长度值,是散列算法的基础原理,MD5的前身有MD2、MD3和MD4。MD5由MD4、MD3、MD2改进而来,主要增强算法复杂度和不可逆性。目前,MD5算法因其普遍、稳定、快速的特点,仍广泛应用于普通 数据的错误检查领域。例如在一些BitTorrent下载,软件将通过计算MD5检验下载到的文件片段的完整性。MD5已经广泛使用在为文件传输提供一定的可靠性方面。例如,服务器预先提供一个MD5校验和,用户下载完文件以后, 用MD5算法计算下载文件的MD5校验和,然后通过检查这两个校验和是否一致,就能判断下载的文件是否出错。MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个 128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。 md5算法描述 假设输入信息(input message)的长度为b(bit),我们想要产生它的报文摘要,在此处b为任意的非负整数:b也可能为0,也不一定为8的整数倍,且可能是任意大的长度。设该信息的比特流表示如下: M[0] M[1] M[2] ... M[b-1] 计算此信息的报文摘要需要如下5步: 1.补位 信息计算前先要进行位补位,设补位后信息的长度为LEN(bit),则LEN%512 = 448(bit),即数据扩展至 K * 512 + 448(bit)。即K * 64+56(byte),K为整数。补位操作始终要执行,即使补位前信息的长度对512求余的结果是448。具体补位操作:补一个1,然后补0至满足上述要求。总共最少要补1bit,最多补512bit。 2.尾部加上信息长度 将输入信息的原始长度b(bit)表示成一个64-bit的数字,把它添加到上一步的结果后面(在32位的机器上,这64位将用2个字来表示并且低位在前)。当遇到b大于2^64这种极少的情况时,b的高位被截去,仅使用b的低64位。经过上面两步,数据就被填补成长度为512(bit)的倍数。也就是说,此时的数据长度是16个字(32byte)的整数倍。此时的数据表示为: M[0 ... N-1] 其的N是16的倍数。 3.初始化缓存区 用一个四个字的缓冲器(A,B,C,D)来计算报文摘要,A,B,C,D分别是32位的寄存器,初始化使用的是十六进制表示的数字,注意低字节在前: word A: 01 23 45 67 word B: 89 ab cd ef word C: fe dc ba 98 word D: 76 54 32 10 4.转换 首先定义4个辅助函数,每个函数的输入是三个32位的字,输出是一个32位的字: F(X,Y,Z) = XY v not(X) Z G(X,Y,Z) = XZ v Y not(Z) H(X,Y,Z) = X xor Y xor Z I(X,Y,Z) = Y xor (X v not(Z)) FF(a,b,c,d,Mj,s,ti)表示 a = b + ((a + F(b,c,d) + Mj + ti) << s) GG(a,b,c,d,Mj,s,ti)表示 a = b + ((a + G(b,c,d) + Mj + ti) << s) HH(a,b,c,d,Mj,s,ti)表示 a = b + ((a + H(b,c,d) + Mj + ti) << s) Ⅱ(a,b,c,d,Mj,s,ti)表示 a = b + ((a + I(b,c,d) + Mj + ti) << s) 这四轮(64步)是: 第一轮 FF(a,b,c,d,M0,7,0xd76aa478) FF(d,a,b,c,M1,12,0xe8c7b756) FF(c,d,a,b,M2,17,0x242070db) FF(b,c,d,a,M3,22,0xc1bdceee) FF(a,b,c,d,M4,7,0xf57c0faf) FF(d,a,b,c,M5,12,0x4787c62a) FF(c,d,a,b,M6,17,0xa8304613) FF(b,c,d,a,M7,22,0xfd469501) FF(a,b,c,d,M8,7,0x698098d8) FF(d,a,b,c,M9,12,0x8b44f7af) FF(c,d,a,b,M10,17,0xffff5bb1) FF(b,c,d,a,M11,22,0x895cd7be) FF(a,b,c,d,M12,7,0x6b901122) FF(d,a,b,c,M13,12,0xfd987193) FF(c,d,a,b,M14,17,0xa679438e) FF(b,c,d,a,M15,22,0x49b40821) 第二轮 GG(a,b,c,d,M1,5,0xf61e2562) GG(d,a,b,c,M6,9,0xc040b340) GG(c,d,a,b,M11,14,0x265e5a51) GG(b,c,d,a,M0,20,0xe9b6c7aa) GG(a,b,c,d,M5,5,0xd62f105d) GG(d,a,b,c,M10,9,0x02441453) GG(c,d,a,b,M15,14,0xd8a1e681) GG(b,c,d,a,M4,20,0xe7d3fbc8) GG(a,b,c,d,M9,5,0x21e1cde6) GG(d,a,b,c,M14,9,0xc33707d6) GG(c,d,a,b,M3,14,0xf4d50d87) GG(b,c,d,a,M8,20,0x455a14ed) GG(a,b,c,d,M13,5,0xa9e3e905) GG(d,a,b,c,M2,9,0xfcefa3f8) GG(c,d,a,b,M7,14,0x676f02d9) GG(b,c,d,a,M12,20,0x8d2a4c8a) 第三轮 HH(a,b,c,d,M5,4,0xfffa3942) HH(d,a,b,c,M8,11,0x8771f681) HH(c,d,a,b,M11,16,0x6d9d6122) HH(b,c,d,a,M14,23,0xfde5380c) HH(a,b,c,d,M1,4,0xa4beea44) HH(d,a,b,c,M4,11,0x4bdecfa9) HH(c,d,a,b,M7,16,0xf6bb4b60) HH(b,c,d,a,M10,23,0xbebfbc70) HH(a,b,c,d,M13,4,0x289b7ec6) HH(d,a,b,c,M0,11,0xeaa127fa) HH(c,d,a,b,M3,16,0xd4ef3085) HH(b,c,d,a,M6,23,0x04881d05) HH(a,b,c,d,M9,4,0xd9d4d039) HH(d,a,b,c,M12,11,0xe6db99e5) HH(c,d,a,b,M15,16,0x1fa27cf8) HH(b,c,d,a,M2,23,0xc4ac5665) 第四轮 Ⅱ(a,b,c,d,M0,6,0xf4292244) Ⅱ(d,a,b,c,M7,10,0x432aff97) Ⅱ(c,d,a,b,M14,15,0xab9423a7) Ⅱ(b,c,d,a,M5,21,0xfc93a039) Ⅱ(a,b,c,d,M12,6,0x655b59c3) Ⅱ(d,a,b,c,M3,10,0x8f0ccc92) Ⅱ(c,d,a,b,M10,15,0xffeff47d) Ⅱ(b,c,d,a,M1,21,0x85845dd1) Ⅱ(a,b,c,d,M8,6,0x6fa87e4f) Ⅱ(d,a,b,c,M15,10,0xfe2ce6e0) Ⅱ(c,d,a,b,M6,15,0xa3014314) Ⅱ(b,c,d,a,M13,21,0x4e0811a1) Ⅱ(a,b,c,d,M4,6,0xf7537e82) Ⅱ(d,a,b,c,M11,10,0xbd3af235) Ⅱ(c,d,a,b,M2,15,0x2ad7d2bb) Ⅱ(b,c,d,a,M9,21,0xeb86d391)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值