资源简介
非对称加密算法,RSA算法纯C语言代码实现,带测试demo
代码片段和文件信息
#include
#include
#include
#include
#include
#include
char buffer[1024];
const int MAX_DIGITS = 50;
int ij = 0;
struct public_key_class{
long long modulus;
long long exponent;
};
struct private_key_class{
long long modulus;
long long exponent;
};
// This should totally be in the math library.
long long gcd(long long a long long b)
{
long long c;
while ( a != 0 ) {
c = a; a = b%a; b = c;
}
return b;
}
long long ExtEuclid(long long a long long b)
{
long long x = 0 y = 1 u = 1 v = 0 gcd = b m n q r;
while (a!=0) {
q = gcd/a; r = gcd % a;
m = x-u*q; n = y-v*q;
gcd = a; a = r; x = u; y = v; u = m; v = n;
}
return y;
}
long long rsa_modExp(long long b long long e long long m)
{
if (b < 0 || e < 0 || m <= 0){
exit(1);
}
b = b % m;
if(e == 0) return 1;
if(e == 1) return b;
if( e % 2 == 0){
return ( rsa_modExp(b * b % m e/2 m) % m );
}
if( e % 2 == 1){
return ( b * rsa_modExp(b (e-1) m) % m );
}
}
// Calling this function will generate a public and private key and store them in the pointers
// it is given.
void rsa_gen_keys(struct public_key_class *pub struct private_key_class *priv char *PRIME_SOURCE_FILE)
{
FILE *primes_list;
if(!(primes_list = fopen(PRIME_SOURCE_FILE “r“))){
fprintf(stderr “Problem reading %s\n“ PRIME_SOURCE_FILE);
exit(1);
}
// count number of primes in the list
long long prime_count = 0;
do{
int bytes_read = fread(buffer1sizeof(buffer)-1 primes_list);
buffer[bytes_read] = ‘\0‘;
for (i=0 ; buffer[i]; i++){
if (buffer[i] == ‘\n‘){
prime_count++;
}
}
}
while(feof(primes_list) == 0);
// choose random primes from the list store them as pq
long long p = 0;
long long q = 0;
long long e = powl(2 8) + 1;
long long d = 0;
char prime_buffer[MAX_DIGITS];
long long max = 0;
long long phi_max = 0;
srand(time(NULL));
do{
// a and b are the positions of p and q in the list
int a = (double)rand() * (prime_count+1) / (RAND_MAX+1.0);
int b = (double)rand() * (prime_count+1) / (RAND_MAX+1.0);
// here we find the prime at position a store it as p
rewind(primes_list);
for(i=0; i < a + 1; i++){
// for(j=0; j < MAX_DIGITS; j++){
// prime_buffer[j] = 0;
// }
fgets(prime_buffersizeof(prime_buffer)-1 primes_list);
}
p = atol(prime_buffer);
// here we find the prime at position b store it as q
rewind(primes_list);
for(i=0; i < b + 1; i++){
for(j=0; j < MAX_DIGITS; j++){
prime_buffer[j] = 0;
}
fgets(prime_buffersizeof(prime_buffer)-1 primes_list);
}
q = atol(prime_buffer);
max = p*q;
phi_max = (p-1)*(q-1);
}
while(!(p && q) || (p == q) || (gcd(phi_max e) != 1));
// Next we need to choose ab so that a*max+b*e = gcd(maxe). We actually only need b
// here and in keeping with the
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5020 2018-06-29 12:55 RSA-Library-C\rsa.c
文件 1649 2018-06-29 12:55 RSA-Library-C\rsa.h
文件 1228 2018-06-29 12:55 RSA-Library-C\test.c
目录 0 2018-11-13 10:08 RSA-Library-C
----------- --------- ---------- ----- ----
7897 4
- 上一篇:VoIP高质量音视频传输技术研究
- 下一篇:AES算法采用verilog硬件实现
相关资源
- c语言标准库源码大全
- [算法:C语言实现(第1-4部分)基础知
- MPI与OpenMP并行程序设计:C语言版
- C语言程序设计课件全套
- 几本英文原版的c语言经典图书
- 单片机交通灯课程设计.zip
- 课程设计--C语言学生成绩管理系统内
- 利用C语言实现的ATM机
- C语言程序设计第四版谭浩强课后习题
- 现代优化设计黄金分割法和二次插值
- 数据结构c语言版第2版课后习题答案
- 谭浩强C语言教程
- 求曼德勃罗集合C语言串行并行代码
- 流程图生成器C语言
- C语言大一期末考小助手
- 谭浩强 程序代码及习题答案(第三版
- 超声波测距及蓝牙模块源码程序c语言
- 重庆邮电大学C语言期末考试题
- 学校教材订购系统,C语言版,内容详
- 利用FFT计算频谱图
- 数据结构——C语言描述》习题及答案
- 郝斌C语言详细笔记().doc
- C语言编写的中文分词程序
- OpenSSL RSA 非对称加密(VS2013,C++实现
- 全国计算机等级考试-二级教程-C语言
- 使用C++实现HDLC协议
- FFT的C语言实现
- LZ77数据压缩C语言源代码
- C语言实现TCP/IP协议通信和UDP协议通信
- 中值滤波_均值滤波c语言实现_工程文
评论
共有 条评论