我需要使用公钥通过 RSA 加密数据并使用私钥解密。不需要生成公钥和私钥。我知道该算法需要计算资源,但我仅使用 32-128 位或更小的密钥。我在互联网上找不到 Arduino 的 RSA 库。
我找到了 AVR 微控制器的密码学 AVR-Crypto-Lib 库。如何在 Arduino 上使用这个库?我认为Arduino兼容,因为它使用ATmega328P、ATmega2560微控制器等。如何在Arduino IDE中包含这个库。如果有人能编写简单的 hello world 示例,那就太好了。或者可以建议其他实现 RSA 算法的库。
我使用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;
}
}