很高兴和大家一起分享rsa公钥加密算法例题的知识,希望对各位有所帮助。
#include stdlib.h
#include stdio.h
#include string.h
#include math.h
#include time.h
#define PRIME_MAX 200 // 生成素数范围
#define EXPONENT_MAX 200 // 生成指数e范围
#define Element_Max 127 // 加密单元的最大值,这里为一个char, 即1Byte
char str_read[100]="hello world !"; // 待加密的原文
int str_encrypt[100]; // 加密后的内容
char str_decrypt[100]; // 解密出来的内容
int str_read_len; // str_read 的长度
int prime1, prime2; // 随机生成的两个质数
int mod, eular; // 模数和欧拉数
int pubKey, priKey; // 公钥指数和私钥指数
// 生成随机素数,实际应用中,这两个质数越大,就越难破解。
int randPrime()
{
int prime, prime2, i;
next:
prime = rand() % PRIME_MAX; // 随机产生数
if (prime = 1) goto next; // 不是质数,生成下一个随机数
if (prime == 2 || prime == 3) return prime;
prime2 = prime / 2; // prime=4, prime2 的平方必定大于 prime , 因此只检查小于等于prime2的数
for (i = 2; i = prime2; i++) // 判断是否为素数
{
if (i * i prime) return prime;
if (prime % i == 0) goto next; // 不是质数,生成下一个随机数
}
}
// 欧几里德算法,判断a,b互质
int gcd(int a, int b)
{
int temp;
while (b != 0) {
temp = b;
b = a % b;
a = temp;
}
return a;
}
//生成公钥指数,条件是 1 e 欧拉数,且与欧拉数互质。
int randExponent()
{
int e;
while (1)
{
e = rand() % eular; if (e EXPONENT_MAX) break;
}
while (1)
{
if (gcd(e, eular) == 1) return e; e = (e + 1) % eular; if (e == 0 || e EXPONENT_MAX) e = 2;
}
}
//生成私钥指数
int inverse()
{
int d, x;
while (1)
{
d = rand() % eular;
x = pubKey * d % eular;
if (x == 1)
{
return d;
}
}
}
//加密函数
void jiami()
{
str_read_len = strlen(str_read); //从参数表示的地址往后找,找到第一个'\0',即串尾。计算'\0'至首地址的“距离”,即隔了几个字符,从而得出长度。
printf("密文是:");
for (int i = 0; i str_read_len; i++)
{
int C = 1; int a = str_read[i], b = a % mod;
for (int j = 0; j pubKey; j++) //实现加密
{
C = (C*b) % mod;
}
str_encrypt[i] = C;
printf("%d ", str_encrypt[i]);
}
printf("\n");
}
//解密函数
void jiemi()
{
int i=0; for (i = 0; i str_read_len; i++)
{
int C = 1; int a = str_encrypt[i], b=a%mod;
for (int j = 0; j priKey; j++)
{
C = (C * b) % mod;
}
str_decrypt[i] = C;
}
str_decrypt[i] = '\0'; printf("解密文是:%s \n", str_decrypt);
}
int main()
{
srand(time(NULL));
while (1)
{
prime1 = randPrime(); prime2 = randPrime(); printf("随机产生两个素数:prime1 = %d , prime2 = %d ", prime1, prime2);
mod = prime1 * prime2; printf("模数:mod = prime1 * prime2 = %d \n", mod); if (mod Element_Max) break; // 模数要大于每个加密单元的值
}
eular = (prime1 - 1) * (prime2 - 1); printf("欧拉数:eular=(prime1-1)*(prime2-1) = %d \n", eular);
pubKey = randExponent(); printf("公钥指数:pubKey = %d\n", pubKey);
priKey = inverse(); printf("私钥指数:priKey = %d\n私钥为 (%d, %d)\n", priKey, priKey, mod);
jiami(); jiemi();
return 0;
}
n=p*q=33
phi=(p-1)(q-1)=20
e=7
e
*
d
=
1
(
mod
phi)
d=17
公私密钥对:
(n,d)
(n,e)
编码过程是,
若资料为
a,
将其看成是一个大整数,
假设
a
n....
如果
a
=
n
的话,
就将
a
表成
s
进位
(s
=
n,
通常取
s
=
2^t),
则每一位数均小於
n,
然後分段编码……
接下来,
计算
b
==
a^d
mod
n,
(0
=
b
n),
b
就是编码後的资料……
解码的过程是,
计算
c
==
b^e
mod
pq
(0
=
c
pq),
於是乎,
解码完毕……
等会会证明
c
和
a
其实是相等的
若P=13而q=31,而e=7,d是多少?公钥是多少?私钥是多少?
N=p*q=13*31=403,
∮(N)=(p-1)(q-1)=12*30=360
因为e=7,ed=1mod∮(N),设一个系数K,ed=∮(N)*k +1,代入 得 7d = 360 k +1
因为K和d必须是整数,因此这里要自己代数进去计,当取k=2时,d=13刚好符合整数这个条件,因此d就等于13了。
公钥的公式是 PK={e,N} , 私钥SK={d,N}, 因此 PK={7,403},SK={13,403}
p=37,q=23
n=pq=851
φ(n)=(p-1)(q-1)=792
取加密指数为e=5,(e,φ(n))=1;(e一般取2^16+1,这里为方便计算就取5了)
则d=e^(-1)mod[φ(n)]=317
于是公钥为(e,n)=(5,851)
私钥为(d,n)=(317,851);
首先说一下求d的答案,ed=1mod(p-1)(q-1)=1mod60即7d=1mod60的意思是e与d的乘积对(p-1)(q-1)取余结果是1,题目给出e=7,(p-1)(q-1)可以求得是60,即(7d)%60=1【%是取余符号】,可以得出43*7=301=5*60+1
题目已给出M=17,秘文C=M^e mod n即M的e次方对n取余,代入数值为17^5%143=10
希望对你有帮助
随着社会的发展,产品的更新速度也是越来越快,算法是方案的核心,保护开发者和消费者的权益刻不容缓,那么加密芯片在其中就扮演了重要的角色,如何选择加密芯片呢?
1.市面上加密芯片种类繁多,算法多种,加密芯片强度参差不齐,加密性能与算法、秘钥密切相关。常见的加密算法有对称算法,非对称算法,国密算法,大部分都是基于I2C、SPI或1-wire协议进行通信。加密芯片还是需要项目实际需求选择,比如对称加密算法的特点是计算量小、加密速度快、加密效率高等。
2.因为单片机软加密性能较弱且非常容易被复制,所以有了加密芯片的产生,大大增加了破解难度和生产成本。目前加密芯片广泛应用于车载电子、消费电子、美容医疗、工业控制、AI智能等行业。
3.韩国KEROS加密芯片专注加密领域十多年,高安全性、低成本,在加密保护领域受到了众多客户的高度赞扬及认可。KEROS采用先进的内置aes256安全引擎和加密功能,通过真动态数据交互并为系统中敏感信息的存储提供了安全的场所,有了它的保护电路,即使受到攻击,这些信息也可以保持安全。其封装SOP8,SOT23-6,TDFN-6集成I2C与1-wire协议满足不同应用需求。CK02AT、CK22AT、CK02AP、CK22AP支持1.8V-3.6V,256bit位秘钥长度,5bytes SN序列号,支持定制化免烧录,加密行业首选。关于rsa公钥加密算法例题的介绍到此就结束了,感谢大家耐心阅读。
本文标签:rsa公钥加密算法例题