Arduino的RSA加密、解密功能

问题描述 投票:0回答:1

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

arduino cryptography rsa avr
1个回答
0
投票

我使用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;
      
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.