代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
基于RSA算法的数字签名
作者:
想了一半个小时
/ 发布于
2013/6/17
/
873
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <stdbool.h> #include <stdint.h> #include <time.h> #include <assert.h> long long temp1,temp2; #define max(a,b) (temp1 = a, temp2 = b, temp1 < temp2 ? temp2 : temp1) #define min(a,b) (temp1 = a, temp2 = b, temp1 < temp2 ? temp1 : temp2) int prime_array[2000] = {2}; //存储2000以内的素数 static int prime_count = 1; //计数2000以内素数个数 struct key { //存储密钥 long long n; long long e; long long d; }key; //判断2000以内数的素性 bool adjust(int value) { if (2 == value) { return true; } for (int i = 0; i < prime_count; i++) { if (value % prime_array[i] == 0) { return false; } } prime_array[prime_count++] = value; return true; } void generate() { for (int i = 3; i < 2000; i++) { adjust(i); } } //生成大奇数 int bigOdd() { srand((unsigned int)time(NULL)); int n = rand() % 2000 + 1; if (n != 0 && n % 2 == 0) { return n - 1; } else if (n != 0 && n % 2 == 1) { return n; } return n; } //生成伪素数 int pseudoprime() { int n = bigOdd(); generate(); for (int i = 0; i < prime_count; i++) { if ((n != prime_array[i]) && ((n % prime_array[i]) == 0)) { i = -1; n = bigOdd(); continue; } } return n; } //蒙哥马利算法 int Montgomery(int a, int p, int m) { if (p == 0) { return 1; } int r = a % m; int k = 1; while (p > 1) { if ((p & 1) != 0) { k = (k * r) % m; } r = (r * r) % m; p >>= 1; } return (r * k) % m; } bool witness(int r, int n) { int a = n - 1; int m = 0; while (!(a & 1)) { m++; a >>= 1; } int x = Montgomery(r,a,n); if (x == 1 || x == n - 1) { return false; } while (m--) { x = x * x % n; if (x == n - 1) { return false; } } return true; } //米勒-拉宾素性检测 bool Miller_Rabin(int n, int T) { if (n < 2) { return false; } if (n == 2) { return true; } if (!(n & 1)) { return false; } while (T--) { int a = rand() * (n - 1) % 2000 + 1; if (witness(a,n)) { return false; } } return true; } //生成大素数 int prime() { int p = pseudoprime(); while (!Miller_Rabin(p,4)) { p = pseudoprime(); } return p; } //辗转相除判别互质 bool gcd(long long p, long long q) { long long div; if ((div = max(p,q) % min(p,q)) == 0) { return false; } else if (min(p,q) % div != 1) { return false; } else { return true; } } //生成密钥 __declspec(dllexport) void createKey() { long long m; bool ok = true; int p = prime(); int q = prime(); while (p == q) { q = prime(); } key.n = p * q; m = (p - 1) * (q - 1); srand((unsigned int)time(NULL)); key.e = rand() % 2000 + 1; while (!gcd(key.e,m)) { key.e = rand() % 2000 + 1; } int d = 1; while (d * key.e % m != 1) { d++; } key.d = d; } __declspec(dllexport) int return_e() { return key.e; } __declspec(dllexport) int return_d() { return key.d; } __declspec(dllexport) int return_n() { return key.n; } //BR算法 long long BR(long long a, long long m, long long n) { int i = -1; int b[100]; long long d; while (m != 0) { i++; b[i] = m % 2; m = m / 2; } d = a * a % n; for (i = i - 1; i > 0; i--) { if (b[i]) { d = (d * a % n) * (d * a % n) % n; } else { d = d * d % n; } } if (b[0]) { d = d * a % n; } return d; } static int count = 0; //计数加密元素个数 //加密模块 __declspec(dllexport)char* encrypt(char *s) { FILE *fp; if ((fp = fopen(s,"r+")) == NULL) { printf("fail to open 1!\n"); } FILE *tmp = tmpfile(); int c; int cnt = 0; while ((c = fgetc(fp)) != EOF) { long long e = BR(c,key.e,key.n); fprintf(tmp,"%lld ",e); cnt++; } count = cnt; rewind(fp); rewind(tmp); long long x; fscanf(tmp,"%lld",&x); while (cnt--) { fprintf(fp,"%lld ",x); fscanf(tmp,"%lld",&x); } fclose(fp); fclose(tmp); return "yes"; } //解密模块 __declspec(dllexport)char* decrypt(char *s) { FILE *fp; if ((fp = fopen(s,"r+")) == NULL) { printf("fail to open 1!\n"); } FILE *tmp = tmpfile(); long long d; int cnt = count; while (cnt--) { fscanf(fp,"%lld",&d); long long c = BR(d,key.d,key.n); fprintf(tmp,"%c",c); } fclose(fp); fp = fopen(s,"w"); rewind(tmp); int c; while ((c = fgetc(tmp)) != EOF) { fprintf(fp,"%c",c); } fclose(fp); fclose(tmp); return "yes"; } #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) #define RL(x, y) (((x) << (y)) | ((x) >> (32 - (y)))) //x向左循环移y位 #define PP(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24) //将x高低位互换,例如PP(aabbccdd)=ddccbbaa #define FF(a, b, c, d, x, s, ac) a = b + (RL((a + F(b,c,d) + x + ac),s)) #define GG(a, b, c, d, x, s, ac) a = b + (RL((a + G(b,c,d) + x + ac),s)) #define HH(a, b, c, d, x, s, ac) a = b + (RL((a + H(b,c,d) + x + ac),s)) #define II(a, b, c, d, x, s, ac) a = b + (RL((a + I(b,c,d) + x + ac),s)) unsigned A,B,C,D,a,b,c,d,i,len,flen[2],x[16]; //i临时变量,len文件长,flen[2]为64位二进制表示的文件初始长度 char filename[200]; //文件名 FILE *fp; void md5(){ //MD5核心算法,供64轮 a=A,b=B,c=C,d=D; /**//* Round 1 */ FF (a, b, c, d, x[ 0], 7, 0xd76aa478); /**//* 1 */ FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); /**//* 2 */ FF (c, d, a, b, x[ 2], 17, 0x242070db); /**//* 3 */ FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); /**//* 4 */ FF (a, b, c, d, x[ 4], 7, 0xf57c0faf); /**//* 5 */ FF (d, a, b, c, x[ 5], 12, 0x4787c62a); /**//* 6 */ FF (c, d, a, b, x[ 6], 17, 0xa8304613); /**//* 7 */ FF (b, c, d, a, x[ 7], 22, 0xfd469501); /**//* 8 */ FF (a, b, c, d, x[ 8], 7, 0x698098d8); /**//* 9 */ FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); /**//* 10 */ FF (c, d, a, b, x[10], 17, 0xffff5bb1); /**//* 11 */ FF (b, c, d, a, x[11], 22, 0x895cd7be); /**//* 12 */ FF (a, b, c, d, x[12], 7, 0x6b901122); /**//* 13 */ FF (d, a, b, c, x[13], 12, 0xfd987193); /**//* 14 */ FF (c, d, a, b, x[14], 17, 0xa679438e); /**//* 15 */ FF (b, c, d, a, x[15], 22, 0x49b40821); /**//* 16 */ /**//* Round 2 */ GG (a, b, c, d, x[ 1], 5, 0xf61e2562); /**//* 17 */ GG (d, a, b, c, x[ 6], 9, 0xc040b340); /**//* 18 */ GG (c, d, a, b, x[11], 14, 0x265e5a51); /**//* 19 */ GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /**//* 20 */ GG (a, b, c, d, x[ 5], 5, 0xd62f105d); /**//* 21 */ GG (d, a, b, c, x[10], 9, 0x02441453); /**//* 22 */ GG (c, d, a, b, x[15], 14, 0xd8a1e681); /**//* 23 */ GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /**//* 24 */ GG (a, b, c, d, x[ 9], 5, 0x21e1cde6); /**//* 25 */ GG (d, a, b, c, x[14], 9, 0xc33707d6); /**//* 26 */ GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); /**//* 27 */ GG (b, c, d, a, x[ 8], 20, 0x455a14ed); /**//* 28 */ GG (a, b, c, d, x[13], 5, 0xa9e3e905); /**//* 29 */ GG (d, a, b, c, x[ 2], 9, 0xfcefa3f8); /**//* 30 */ GG (c, d, a, b, x[ 7], 14, 0x676f02d9); /**//* 31 */ GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); /**//* 32 */ /**//* Round 3 */ HH (a, b, c, d, x[ 5], 4, 0xfffa3942); /**//* 33 */ HH (d, a, b, c, x[ 8], 11, 0x8771f681); /**//* 34 */ HH (c, d, a, b, x[11], 16, 0x6d9d6122); /**//* 35 */ HH (b, c, d, a, x[14], 23, 0xfde5380c); /**//* 36 */ HH (a, b, c, d, x[ 1], 4, 0xa4beea44); /**//* 37 */ HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); /**//* 38 */ HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); /**//* 39 */ HH (b, c, d, a, x[10], 23, 0xbebfbc70); /**//* 40 */ HH (a, b, c, d, x[13], 4, 0x289b7ec6); /**//* 41 */ HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); /**//* 42 */ HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); /**//* 43 */ HH (b, c, d, a, x[ 6], 23, 0x04881d05); /**//* 44 */ HH (a, b, c, d, x[ 9], 4, 0xd9d4d039); /**//* 45 */ HH (d, a, b, c, x[12], 11, 0xe6db99e5); /**//* 46 */ HH (c, d, a, b, x[15], 16, 0x1fa27cf8); /**//* 47 */ HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); /**//* 48 */ /**//* Round 4 */ II (a, b, c, d, x[ 0], 6, 0xf4292244); /**//* 49 */ II (d, a, b, c, x[ 7], 10, 0x432aff97); /**//* 50 */ II (c, d, a, b, x[14], 15, 0xab9423a7); /**//* 51 */ II (b, c, d, a, x[ 5], 21, 0xfc93a039); /**//* 52 */ II (a, b, c, d, x[12], 6, 0x655b59c3); /**//* 53 */ II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); /**//* 54 */ II (c, d, a, b, x[10], 15, 0xffeff47d); /**//* 55 */ II (b, c, d, a, x[ 1], 21, 0x85845dd1); /**//* 56 */ II (a, b, c, d, x[ 8], 6, 0x6fa87e4f); /**//* 57 */ II (d, a, b, c, x[15], 10, 0xfe2ce6e0); /**//* 58 */ II (c, d, a, b, x[ 6], 15, 0xa3014314); /**//* 59 */ II (b, c, d, a, x[13], 21, 0x4e0811a1); /**//* 60 */ II (a, b, c, d, x[ 4], 6, 0xf7537e82); /**//* 61 */ II (d, a, b, c, x[11], 10, 0xbd3af235); /**//* 62 */ II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /**//* 63 */ II (b, c, d, a, x[ 9], 21, 0xeb86d391); /**//* 64 */ A += a; B += b; C += c; D += d; } __declspec(dllexport)char* use_md5(char *str,char *output_file) { char *filename = str; //用get函数,避免scanf以空格分割数据, if (filename[0]==34) filename[strlen(filename)-1]=0,strcpy(filename,filename+1); //支持文件拖曳,但会多出双引号,这里是处理多余的双引号 if (!strcmp(filename,"exit")) exit(0); //输入exit退出 if (!(fp=fopen(filename,"rb"))) { } //以二进制打开文件 fseek(fp, 0, SEEK_END); //文件指针转到文件末尾 if((len=ftell(fp))==-1) { fclose(fp); } //ftell函数返回long,最大为2GB,超出返回-1 rewind(fp); //文件指针复位到文件头 A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476; //初始化链接变量 flen[1]=len/0x20000000; //flen单位是bit flen[0]=(len%0x20000000)*8; memset(x,0,64); //初始化x数组为0 fread(&x,4,16,fp); //以4字节为一组,读取16组数据 for(i=0;i<len/64;i++){ //循环运算直至文件结束 md5(); memset(x,0,64); fread(&x,4,16,fp); } ((char*)x)[len%64]=128; //文件结束补1,补0操作,128二进制即10000000 if(len%64>55) md5(),memset(x,0,64); memcpy(x+14,flen,8); //文件末尾加入原文件的bit长度 md5(); fclose(fp); fp = fopen(filename,"a"); fseek(fp,0,SEEK_END); fprintf(fp,"MD5 Code:%08x%08x%08x%08x\n",PP(A),PP(B),PP(C),PP(D)); //高低位逆反输出 FILE *out; out = fopen(output_file,"w"); fprintf(out,"%08x%08x%08x%08x",PP(A),PP(B),PP(C),PP(D)); fclose(out); fclose(fp); return "yes"; } __declspec(dllexport)char* confirm_message(char *input,char *message) { FILE *fp; fp = fopen(input,"r"); fseek(fp,-34L,SEEK_END); char *str1,*str2; str1 = (char*)malloc(sizeof(char)*33); str2 = (char*)malloc(sizeof(char)*33); fgets(str1,32,fp); FILE *m; m = fopen(message,"r"); fgets(str2,32,m); fclose(fp); fclose(m); if (0==strcmp(str1,str2)) { return "yes"; } else { return "no"; } } __declspec(dllexport)char* restore_file(char *input) { FILE *tmp = tmpfile(); fp = fopen(input,"r"); fseek(fp,-49L,SEEK_END); int cnt = ftell(fp); fseek(fp,0L,SEEK_SET); while (cnt--) { c = fgetc(fp); fputc(c,tmp); } fclose(fp); rewind(tmp); fp = fopen("D:\\rsa.txt","w"); while ((c = fgetc(tmp)) != EOF) { fputc(c,fp); } fclose(fp); fclose(tmp); return "yes"; } RSA_MD5.py # -*- coding: cp936 -*- from ctypes import * import wx import os lib = cdll.LoadLibrary("C:\\Users\\lb\\code\\new.dll") s1=None s2=None s3=None class RSAFrame(wx.Frame): def __init__(self,parent,id): wx.Frame.__init__(self,parent,id,"Digital signature based on RSA algorithm--by аж╠С",size = (500,520)) self.panel = wx.Panel(self,-1) self.button1 = wx.Button(self.panel,-1,"Generate key",size = (100,100),pos = (10,10)) self.Bind(wx.EVT_BUTTON,self.ClickButtonGenerate,self.button1) self.button2 = wx.Button(self.panel,-1,"Choice file",size=(100,25),pos = (10,160)) self.Bind(wx.EVT_BUTTON,self.ClickButtonChoice1,self.button2) self.button3 = wx.Button(self.panel,-1,"Choice file",size=(100,25),pos = (10,200)) self.Bind(wx.EVT_BUTTON,self.ClickButtonChoice2,self.button3) self.button4 = wx.Button(self.panel,-1,"Choice file",size=(100,25),pos = (10,240)) self.Bind(wx.EVT_BUTTON,self.ClickButtonChoice3,self.button4) self.button5 = wx.Button(self.panel,-1,"MD5",size=(100,25),pos= (10,280)) self.Bind(wx.EVT_BUTTON,self.ClickButtonChoiceMD5,self.button5) self.button6 = wx.Button(self.panel,-1,"Encrypt",size =(100,25),pos = (10,320)) self.Bind(wx.EVT_BUTTON,self.ClickButtonEncrypt,self.button6) self.button7 = wx.Button(self.panel,-1,"Decrypt",size =(100,25),pos = (10,360)) self.Bind(wx.EVT_BUTTON,self.ClickButtonDecrypt,self.button7) self.button8 = wx.Button(self.panel,-1,"verification",size=(100,25),pos = (10,400)) self.Bind(wx.EVT_BUTTON,self.ClickButtonChoiceVer,self.button8) self.button9 = wx.Button(self.panel,-1,"restore file",size=(100,25),pos = (10,440)) self.Bind(wx.EVT_BUTTON,self.ClickButtonChoiceRe,self.button9) self.txt1 = wx.StaticText(self.panel,-1,"public key",pos = (120,15)) self.txt2 = wx.StaticText(self.panel,-1,"secret key",pos = (120,75)) self.txt3 = wx.StaticText(self.panel,-1,"input file",pos = (120,160)) self.txt4 = wx.StaticText(self.panel,-1,"output file",pos = (120,200)) self.txt5 = wx.StaticText(self.panel,-1,"message file",pos = (120,240)) self.txt6 = wx.StaticText(self.panel,-1,"message",pos = (120,280)) self.txt7 = wx.StaticText(self.panel,-1,"yes/no",pos = (120,320)) self.txt8 = wx.StaticText(self.panel,-1,"yes/no",pos = (120,360)) self.txt9 = wx.StaticText(self.panel,-1,"yes/no",pos = (120,400)) self.txt10 = wx.StaticText(self.panel,-1,"yes/no",pos = (120,440)) wildcard = "Python source (*.txt)|*.txt|" \ "Compiled Python (*.py)|*.py|" \ "All files (*.*)|*.*" self.dialog = wx.FileDialog(None, "Choose a file", os.getcwd(), "", wildcard, wx.OPEN) def ClickButtonGenerate(self,event): lib.createKey() wx.TextCtrl(self.panel,-1,str(lib.return_e()),size = (250,25),pos = (200,15)) wx.TextCtrl(self.panel,-1,str(lib.return_n()),size = (250,25),pos = (200,40)) wx.TextCtrl(self.panel,-1,str(lib.return_d()),size = (250,25),pos = (200,75)) wx.TextCtrl(self.panel,-1,str(lib.return_n()),size = (250,25),pos = (200,100)) def ClickButtonChoice1(self,event): if self.dialog.ShowModal() == wx.ID_OK: wx.TextCtrl(self.panel,-1,self.dialog.GetPath(),pos = (200,160)) global s1 s1=create_string_buffer(str(self.dialog.GetPath())) def ClickButtonChoice2(self,event): if self.dialog.ShowModal() == wx.ID_OK: wx.TextCtrl(self.panel,-1,self.dialog.GetPath(),pos = (200,200)) global s2 s2=create_string_buffer(str(self.dialog.GetPath())) def ClickButtonChoice3(self,event): if self.dialog.ShowModal() == wx.ID_OK: wx.TextCtrl(self.panel,-1,self.dialog.GetPath(),pos = (200,240)) global s3 s3=create_string_buffer(str(self.dialog.GetPath())) def ClickButtonChoiceMD5(self,event): lib.use_md5.restype = c_char_p lib.use_md5.argtypes = [c_char_p] global s1 global s3 txt = lib.use_md5(s1,s3) wx.TextCtrl(self.panel,-1,txt,size = (250,25),pos = (200,280)) def ClickButtonEncrypt(self,event): lib.encrypt.restype = c_char_p lib.encrypt.argtypes = [c_char_p] global s1 global s2 txt = lib.encrypt(s1,s2) wx.TextCtrl(self.panel,-1,txt,size = (250,25),pos = (200,320)) def ClickButtonDecrypt(self,event): lib.decrypt.restype = c_char_p lib.decrypt.argtypes = [c_char_p] global s1 global s2 txt = lib.decrypt(s2,s1) wx.TextCtrl(self.panel,-1,txt,size = (250,25),pos = (200,360)) def ClickButtonChoiceVer(self,event): lib.confirm_message.restype = c_char_p lib.confirm_message.argtypes = [c_char_p] global s1 global s3 wx.TextCtrl(self.panel,-1,lib.confirm_message(s1,s3),size = (250,25),pos = (200,400)) def ClickButtonChoiceRe(self,event): lib.restore_file.restype = c_char_p lib.restore_file.argtypes = [c_char_p] global s1 wx.TextCtrl(self.panel,-1,lib.restore_file(s1),size = (250,25),pos = (200,440)) if __name__ == '__main__': app = wx.PySimpleApp() frame = RSAFrame(parent = None,id = -1) frame.Show() app.MainLoop()
试试其它关键字
RSA算法
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
想了一半个小时
贡献的其它代码
(
1
)
.
基于RSA算法的数字签名
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3