rsa库文件c|如何用C语言来使用openssl rsa进行公钥加密已有公钥和明文

❶ RSA加密算法怎样用C语言实现 急急急!!!

/*数据只能是大写字母组成的字符串。 加密的时候,输入Y,然后输入要加密的文本(大写字母) 解密的时候,输入N,然后输入一个整数n表示密文的个数,然后n个整数表示加密时候得到的密文。 *//*RSA algorithm */ #include <stdio.h> #include <string.h> #include <stdlib.h> #define MM 7081 #define KK 1789 #define PHIM 6912 #define PP 85 typedef char strtype[10000]; int len; long nume[10000]; int change[126]; char antichange[37]; void initialize() { int i; char c; for (i = 11, c = 'A'; c <= 'Z'; c ++, i ++) { change[c] = i; antichange[i] = c; } } void changetonum(strtype str) { int l = strlen(str), i; len = 0; memset(nume, 0, sizeof(nume)); for (i = 0; i < l; i ++) { nume[len] = nume[len] * 100 + change[str[i]]; if (i % 2 == 1) len ++; } if (i % 2 != 0) len ++; } long binamod(long numb, long k) { if (k == 0) return 1; long curr = binamod (numb, k / 2); if (k % 2 == 0) return curr * curr % MM; else return (curr * curr) % MM * numb % MM; } long encode(long numb) { return binamod(numb, KK); } long decode(long numb) { return binamod(numb, PP); } main() { strtype str; int i, a1, a2; long curr; initialize(); puts("Input 'Y' if encoding, otherwise input 'N':"); gets(str); if (str[0] == 'Y') { gets(str); changetonum(str); printf("encoded: "); for (i = 0; i < len; i ++) { if (i) putchar('-'); printf(" %ld ", encode(nume[i])); } putchar('\n'); } else { scanf("%d", &len); for (i = 0; i < len; i ++) { scanf("%ld", &curr); curr = decode(curr); a1 = curr / 100; a2 = curr % 100; printf("decoded: "); if (a1 != 0) putchar(antichange[a1]); if (a2 != 0) putchar(antichange[a2]); } putchar('\n'); } putchar('\n'); system("PAUSE"); return 0; }/*测试: 输入: Y FERMAT 输出: encoded: 5192 – 2604 – 4222 输入 N 3 5192 2604 4222 输出 decoded: FERMAT*/

❷ 如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文

1. 本程序使用2048位密钥对,每次加密时,原始数据的最大长度为245字节,加密后的密文长度为256字节.(采用打PADDING 的加密方式)2. 如果所加密数据长度大于245字节,请分多次加密,后将密文按顺序存储;解密时,每次读取256字节,进行解密,将解密后的数据依次按顺序存储,即可还原原始数据.#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <openssl/rsa.h>#include <openssl/pem.h>#include <openssl/err.h>#define OPENSSLKEY "test.key"#define PUBLICKEY "test_pub.key"#define BUFFSIZE 1024char *my_encrypt(char *str, char *path_key); //加密char *my_decrypt(char *str, char *path_key); //解密int main(void){char *source = "i like dancing !!!";char *ptf_en, *ptf_de;printf("source is :%s\n", source);//1.加密ptf_en = my_encrypt(source, PUBLICKEY);if (ptf_en == NULL){return 0;}else{printf("ptf_en is :%s\n", ptf_en);}//2.解密ptf_de = my_decrypt(ptf_en, OPENSSLKEY);if (ptf_de == NULL){return 0;}else{printf("ptf_de is :%s\n", ptf_de);}if(ptf_en) free(ptf_en);if(ptf_de) free(ptf_de);return 0;}//加密char *my_encrypt(char *str, char *path_key){char *p_en = NULL;RSA *p_rsa = NULL;FILE *file = NULL;int lenth = 0; //flen为源文件长度, rsa_len为秘钥长度//1.打开秘钥文件if((file = fopen(path_key, "rb")) == NULL){perror("fopen() error 111111111 ");goto End;} //2.从公钥中获取 加密的秘钥if((p_rsa = PEM_read_RSA_PUBKEY(file, NULL,NULL,NULL )) == NULL){ERR_print_errors_fp(stdout);goto End;}lenth = strlen(str);p_en = (char *)malloc(256);if(!p_en){perror("malloc() error 2222222222");goto End;} memset(p_en, 0, 256);//5.对内容进行加密if(RSA_public_encrypt(lenth, (unsigned char*)str, (unsigned char*)p_en, p_rsa, RSA_PKCS1_PADDING) < 0){perror("RSA_public_encrypt() error 2222222222");goto End;}End://6.释放秘钥空间, 关闭文件if(p_rsa) RSA_free(p_rsa);if(file) fclose(file);return p_en;} //解密char *my_decrypt(char *str, char *path_key){char *p_de = NULL;RSA *p_rsa = NULL;FILE *file = NULL;//1.打开秘钥文件file = fopen(path_key, "rb");if(!file){perror("fopen() error 22222222222");goto End;} //2.从私钥中获取 解密的秘钥if((p_rsa = PEM_read_RSAPrivateKey(file, NULL,NULL,NULL )) == NULL){ERR_print_errors_fp(stdout);goto End;}p_de = (char *)malloc(245);if(!p_de){perror("malloc() error ");goto End;} memset(p_de, 0, 245);//5.对内容进行加密if(RSA_private_decrypt(256, (unsigned char*)str, (unsigned char*)p_de, p_rsa, RSA_PKCS1_PADDING) < 0){perror("RSA_public_encrypt() error ");goto End;}End://6.释放秘钥空间, 关闭文件if(p_rsa) RSA_free(p_rsa);if(file) fclose(file);return p_de;}

❸ 哪位大神能写一个RSA算法的文件加密解密的C程序给我,可以对文件进行加密和解密,在线等,急!!!!

看看这渗袭棚个禅橘吧丛则http://www.coders-hub.com/2013/04/c-code-to-encrypt-and-decrypt-message.html#.VmPqwvlVhP4

❹ 求RSA算法的源代码(c语言)

这个是我帮个朋友写的,写的时候发现其实这个没那么复杂,不过,时间复杂度要高于那些成型了的,为人所熟知碧饥岁的rsa算法的其他语言实现.#includeintcandp(inta,intb,intc){intr=1;b=b+1;while(b!=1){r=r*a;r=r%c;b–;}printf("%d",r);returnr;}voidmain(){intp,q,e,d,m,n,t,c,r;chars;{printf("inputthep:\n");scanf("%d\n",&p);printf("inputtheq:\n");scanf("%d%d\n",&p);n=p*q;printf("so,thenis%3d\n",n);t=(p-1)*(q-1);printf("so,thetis%3d\n",t);printf("pleaseintputthee:\n");scanf("肢闷%d",&e);if(e<1||e>t){printf("eiserror,pleaseinputagain;");scanf("%d",&e);}d=1;while(((e*d)%t)!=1)d++;printf("thencaculateoutthatthedis%5d",d);printf("ifyouwanttokonwthecipherpleaseinput1;\nifyouwanttokonwtheplainpleaseinput2;\n");scanf("%d",&r);if(r==1){printf("inputthem:");/*输入要加密的明文数字*/scanf("%d\n",&m);c=candp(m,e,n);printf("so,thecipheris%4d",c);}if(r==2){printf("inputthec:");/*输入要解密的密文数字*/scanf("悔睁%d\n",&c);m=candp(c,d,n);printf("so,thecipheris%4d\n",m);printf("doyouwanttousethisprograme:yesorno");scanf("%s",&s);}while(s=='y');}}

❺ RSA算法的C++实现

RSA算法介绍及java实现,其实java和c++差不多,参考一下吧 <一>基础 RSA算法非常简单,概述如下: 找两素数p和q 取n=p*q 取t=(p-1)*(q-1) 取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1) 取d*e%t==1 这样最终得到三个数: n d e 设消息为数M (M <n) 设c=(M**d)%n就得到了加密后的消息c 设m=(c**e)%n则 m == M,从而完成对c的解密。 注:**表示次方,上面两式中的d和e可以互换。 在对称加密中: n d两个数构成公钥,可以告诉别人; n e两个数构成私钥,e自己保留,不让任何人知道。 给手竖别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。 别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。 rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解 从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法 求得d。 <二>实践 接下来我们来一个实践,看看实际的操作: 找两个素数: p=47 q=59 这样 n=p*q=2773 t=(p-1)*(q-1)=2668 取e=63,满足e<t并且e和t互素 用perl简单穷举可以获得满主 e*d%t ==1的数d: C:\Temp>perl -e "foreach $i (1..9999){ print($i),last if $i*63%2668==1 }" 847 即d=847 最终我们获得关键的 n=2773 d=847 e=63 取消息M=244我们看看 加密: c=M**d%n = 244**847%2773 用perl的大数计算来算一下: C:\Temp>perl -Mbigint -e "print 244**847%2773" 465 即用d对M加密后获得加密信息c=465 解密: 我们可以用e来对加密后的c进行解密,还原M: m=c**e%n=465**63%2773 : C:\Temp>perl -Mbigint -e "print 465**63%2773" 244 即用e对c解密后毕磨大获得m=244 , 该值和原始信息M相等。 <三>字符串加密 把上面的过程集成一下我们就能实现一个对字符串加密解密的示例了。 每次取字符串中的一个字符的ascii值作为M进行计算,其输出为加密后16进制 的数的字符串形式,游毁按3字节表示,如01F 代码如下: #!/usr/bin/perl -w #RSA 计算过程学习程序编写的测试程序 #watercloud 2003-8-12 # use strict; use Math::BigInt; my %RSA_CORE = (n=>2773,e=>63,d=>847); #p=47,q=59 my $N=new Math::BigInt($RSA_CORE{n}); my $E=new Math::BigInt($RSA_CORE{e}); my $D=new Math::BigInt($RSA_CORE{d}); print "N=$N D=$D E=$E\n"; sub RSA_ENCRYPT { my $r_mess = shift @_; my ($c,$i,$M,$C,$cmess); for($i=0;$i < length($$r_mess);$i++) { $c=ord(substr($$r_mess,$i,1)); $M=Math::BigInt->new($c); $C=$M->(); $C->bmodpow($D,$N); $c=sprintf "%03X",$C; $cmess.=$c; } return \$cmess; } sub RSA_DECRYPT { my $r_mess = shift @_; my ($c,$i,$M,$C,$dmess); for($i=0;$i < length($$r_mess);$i+=3) { $c=substr($$r_mess,$i,3); $c=hex($c); $M=Math::BigInt->new($c); $C=$M->(); $C->bmodpow($E,$N); $c=chr($C); $dmess.=$c; } return \$dmess; } my $mess="RSA 娃哈哈哈~~~"; $mess=$ARGV[0] if @ARGV >= 1; print "原始串:",$mess,"\n"; my $r_cmess = RSA_ENCRYPT(\$mess); print "加密串:",$$r_cmess,"\n"; my $r_dmess = RSA_DECRYPT($r_cmess); print "解密串:",$$r_dmess,"\n"; #EOF 测试一下: C:\Temp>perl rsa-test.pl N=2773 D=847 E=63 原始串:RSA 娃哈哈哈~~~ 加密串: 解密串:RSA 娃哈哈哈~~~ C:\Temp>perl rsa-test.pl 安全焦点(xfocus) N=2773 D=847 E=63 原始串:安全焦点(xfocus) 加密串: 解密串:安全焦点(xfocus) <四>提高 前面已经提到,rsa的安全来源于n足够大,我们测试中使用的n是非常小的,根本不能保障安全性, 我们可以通过RSAKit、RSATool之类的工具获得足够大的N 及D E。 通过工具,我们获得1024位的N及D E来测试一下: n=EC3A85F5005D 4C2013433B383B A50E114705D7E2 BC511951 d=0x10001 e=DD28C523C2995 47B77324E66AFF2 789BD782A592D2B 1965 设原始信息 M= 完成这么大数字的计算依赖于大数运算库,用perl来运算非常简单: A) 用d对M进行加密如下: c=M**d%n : C:\Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x11111111111122222222222233 333333333, 0x10001, D55EDBC4F0 6E37108DD6 );print $x->as_hex" b73d2576bd 47715caa6b d59ea89b91 f1834580c3f6d90898 即用d对M加密后信息为: c=b73d2576bd 47715caa6b d59ea89b91 f1834580c3f6d90898 B) 用e对c进行解密如下: m=c**e%n : C:\Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x17b287be418c69ecd7c39227ab 5aa1d99ef3 0cb4764414 , 0xE760A 3C29954C5D 7324E66AFF 2789BD782A 592D2B1965, CD15F90 4F017F9CCF DD60438941 );print $x->as_hex" (我的P4 1.6G的机器上计算了约5秒钟) 得到用e解密后的m= == M C) RSA通常的实现 RSA简洁幽雅,但计算速度比较慢,通常加密中并不是直接使用RSA 来对所有的信息进行加密, 最常见的情况是随机产生一个对称加密的密钥,然后使用对称加密算法对信息加密,之后用 RSA对刚才的加密密钥进行加密。 最后需要说明的是,当前小于1024位的N已经被证明是不安全的 自己使用中不要使用小于1024位的RSA,最好使用2048位的。 ———————————————————- 一个简单的RSA算法实现JAVA源代码: filename:RSA.java /* * Created on Mar 3, 2005 * * TODO To change the template for this generated file go to * Window – Preferences – Java – Code Style – Code Templates */ import java.math.BigInteger; import java.io.InputStream; import java.io.OutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.FileWriter; import java.io.FileReader; import java.io.BufferedReader; import java.util.StringTokenizer; /** * @author Steve * * TODO To change the template for this generated type comment go to * Window – Preferences – Java – Code Style – Code Templates */ public class RSA { /** * BigInteger.ZERO */ private static final BigInteger ZERO = BigInteger.ZERO; /** * BigInteger.ONE */ private static final BigInteger ONE = BigInteger.ONE; /** * Pseudo BigInteger.TWO */ private static final BigInteger TWO = new BigInteger("2"); private BigInteger myKey; private BigInteger myMod; private int blockSize; public RSA (BigInteger key, BigInteger n, int b) { myKey = key; myMod = n; blockSize = b; } public void encodeFile (String filename) { byte[] bytes = new byte[blockSize / 8 + 1]; byte[] temp; int tempLen; InputStream is = null; FileWriter writer = null; try { is = new FileInputStream(filename); writer = new FileWriter(filename + ".enc"); } catch (FileNotFoundException e1){ System.out.println("File not found: " + filename); } catch (IOException e1){ System.out.println("File not found: " + filename + ".enc"); } /** * Write encoded message to 'filename'.enc */ try { while ((tempLen = is.read(bytes, 1, blockSize / 8)) > 0) { for (int i = tempLen + 1; i < bytes.length; ++i) { bytes[i] = 0; } writer.write(encodeDecode(new BigInteger(bytes)) + " "); } } catch (IOException e1) { System.out

❻ rsa算法c语言实现

程序修改如下:(主要是你的循环写的不对,输入的字符应该-'0'才能与正常的数字对应)#include<stdio.h>#include<math.h>intcandp(inta,intb,intc){intr=1;ints;inti=1;for(i=1;i<=b;i++)r=r*a;printf("%d\",r);s=r%c;printf("%d\",s);returns;}voidmain(){intp,q,e,d,m,n,t,c,r;chars;printf("pleaseinputthep,q:");scanf("%d%d",&p,&q);n=p*q;t=(p-1)*(q-1);printf("thenis%12d\",n);printf("pleaseinputthee:");scanf("搭雀%d",&e);while(e<1||e>n)//此处早卜修改为while循环{printf("eiserror,pleaseinputagain:");scanf("%d",&e);}d=1;while(((e*d)%t)!=1)d++;printf("thencaculateoutthatthedis%d\",d);printf("thecipherpleaseinput1\");printf("theplainpleaseinput2\"陆枝穗);scanf("%c",&s);while((s-'0')!=1&&(s-'0')!=2)//消除后面的getchar()此处增加while循环注意括号内的字符{scanf("%c",&s);}switch(s-'0'){case1:printf("intputthem:");scanf("%d",&m);c=candp(m,e,n);printf("theplainis%d\",c);break;case2:printf("inputthec:");scanf("%d",&c);m=candp(c,d,n);printf("thecipheris%8d\",m);break;}}

❼ 如何用C语言实现RSA算法

上学期交的作业,已通枣伍过老师在运行时间上的测试#include <stdio.h>#include <stdlib.h>unsigned long prime1,prime2,ee;unsigned long *kzojld(unsigned long p,unsigned long q) //扩展欧几里得算法求模逆{unsigned long i=0,a=1,b=0,c=0,d=1,temp,mid,ni[2];mid=p;while(mid!=1){while(p>q){p=p-q;mid=p;i++;} a=c*(-1)*i+a;b=d*(-1)*i+b;temp=a;a=c;c=temp;temp=b;b=d;d=temp;temp=p;p=q;q=temp;i=0;}ni[0]=c;ni[1]=d;return(ni);}unsigned long momi(unsigned long a,unsigned long b,unsigned long p) //模幂算法{unsigned long c;c=1;if(a>p) a=a%p;if(b>p) b=b%(p-1);while(b!=0){while(b%2==0){b=b/2;a=(a*a)%p;}b=b-1;c=(a*c)%p;}return(c);}void RSAjiami() //RSA加密函数{unsigned long c1,c2;unsigned long m,n,c;n=prime1*prime2;system("cls");printf("Please input the message:\n");scanf("%lu",&m);getchar();c=momi(m,ee,n);printf("The cipher is:%lu",c);return;}void RSAjiemi() //RSA解密函数{unsigned long m1,m2,e,d,*ni;unsigned long c,n,m,o;o=(prime1-1)*(prime2-1);n=prime1*prime2;system("cls");printf("Please input the cipher:\n");scanf("%lu",&c);getchar();ni=kzojld(ee,o);d=ni[0];m=momi(c,d,n);printf("The original message is:%lu",m);return;}void main(){unsigned long m;char cho;printf("Please input the two prime you want to use:\n");printf("帆岩咐P=");scanf("%lu",&prime1);getchar();printf("Q=");scanf("%lu",&prime2);getchar();printf("E="态纯);scanf("%lu",&ee);getchar();if(prime1<prime2){m=prime1;prime1=prime2;prime2=m;}while(1){system("cls");printf("\t*******RSA密码系统*******\n");printf("Please select what do you want to do:\n");printf("1.Encrpt.\n");printf("2.Decrpt.\n");printf("3.Exit.\n");printf("Your choice:");scanf("%c",&cho);getchar();switch(cho){case '1':RSAjiami();break;case '2':RSAjiemi();break;case '3':exit(0);default:printf("Error input.\n");break;}getchar();}}


赞 (0)