我需要加密数据与RSA使用公钥和解密使用私钥。不需要生成公钥和私钥。我知道该算法需要计算资源,但我只使用32-128位密钥或更小的密钥。我在互联网上找不到Arduino的RSA库。
我找到了AVR微控制器的密码学AVR-Crypto-Lib库。如何在Arduino中使用这个库?我认为Arduino兼容,因为它使用ATmega328P,ATmega2560微控制器等。如何在Arduino IDE中包含这个库。如果有人能写出简单的hello world示例就好了。也可以推荐其他实现RSA算法的库。
发布于 2020-09-14 14:22:51
我使用Arduino的random()开发了以下代码。但是代码在10次迭代中运行一次,也是在8位密钥。
#include "pRNG.h"
#include <Arduino.h>
unsigned int Firstprime, Secondprime, Privatekey, Publickey;
unsigned int Field, phin, Enc, Dec;
bool Hasrun= false;
unsigned int Text = 12;
pRNG prn;
unsigned int modMult(unsigned int a, unsigned int b, unsigned int mod) //modulo multiplication function
{
unsigned int res = 0; // Initialize result
a = a % mod;
while (b > 0)
{
// If b is odd, add 'a' to result
if (b % 2 == 1)
res = (res + a) % mod;
// Multiply 'a' with 2
a = (a * 2) % mod;
// Divide b by 2
b /= 2;
}
// Return result
return res % mod;
}
bool prime(unsigned int number) //primality check for prime numbers
{
for (unsigned int i = 2; i <=sqrt(number); ++i)
{
if (number % i == 0)
{
return false;
}
}
return true;
}
unsigned int PRN() //generation of a prime random number
{
unsigned int n1;
do
{
n1= prn.getRndByte();
//n1= random(100);
}while(n1==0||prime(n1)==false);
return n1;
}
unsigned int gcd(unsigned int a, unsigned int b) //function to check GCD
{
unsigned int temp;
while (1)
{
temp = a%b;
if (temp == 0)
return b;
a = b;
b= temp;
}
}
unsigned int E_gen(unsigned int n, unsigned int phi) //publickey generation e
{
for(unsigned int i=2; i<n; i++)
{
if(gcd(i,n)==1 && gcd(i,phi)==1)
{
return i;
//break;
}
}
Serial.println("Public key generated");
}
unsigned int D_gen(unsigned int en, unsigned int phi) //privatekey generation d
{
for(unsigned int i=2; i<phi; i++)
{
if(modMult(en,i,phi)==1)
{
return i;
//break;
}
}
Serial.println("Private key generated");
}
unsigned int power(unsigned int base, unsigned int expo, unsigned int mod)
{
unsigned int test;
for(test = 1; expo; expo >>= 1)
{
if (expo & 1)
test = (test * base) % mod;
base = (base * base) % mod;
}
return test;
}
/*unsigned int keygen()
{
}*/
void setup()
{
Serial.begin(9600);
// randomSeed(analogRead(A0));
Firstprime=PRN();
Serial.println(Firstprime);
do
{
Secondprime=PRN();
Serial.println(Secondprime);
}while(Firstprime==Secondprime);
Field=Firstprime*Secondprime;
phin=(Firstprime-1)*(Secondprime-1);
Publickey=E_gen(Field, phin);
Privatekey=D_gen(Publickey,phin);
}
void loop()
{
if(Hasrun==false)
{
//Serial.println(prn.getRndunsigned int());
Serial.print("Public key is:");
Serial.println(Publickey);
Serial.print("Private key is:");
Serial.println(Privatekey);
Serial.println("Encrypting....");
Enc= power(Text,Publickey, Field);
Serial.println(Enc);
Serial.println("Decrypting...");
Dec=power(Enc,Privatekey, Field);
Serial.println(Dec);
/*Serial.println(p);
Serial.println(q);*/
Hasrun=true;
}
}
https://stackoverflow.com/questions/39189065
复制相似问题