2013-09-10 51 views
2

我试图在Arduino和PHP之间进行一种安全的通信。我无法使用SSL,因为Arduino缺乏电源。所以我想用RC4加密来自PHP的数据,并接收到Arduino并解密。也从Arduino加密并发送到PHP。使用RC4和base64实现arduino和PHP之间的安全通信

问题是从PHP发送的加密数据不一致在Arduino中。

在PHP上,我在base64中获得了HesshwkfFk8Q,在Arduino中获得了base64中的nZcwrlpZEr0V。 不同的结果,当他们应该是平等的。

我想我有一个错误的Arduino RC4实现。我使用这个https://github.com/adamvr/arduino-base64

这是代码:

的Arduino

#include <Base64.h> 

unsigned char S[256]; 
char has[512]; 

#define S_SWAP(a,b) do { int t = S[a]; S[a] = S[b]; S[b] = t; } while(0) 

void rc4(char *key, char *data){ 
    int i,j; 

    for (i=0;i<256;i++){ 
     S[i] = i; 
    } 

    j = 0; 
    for (i=0;i<256;i++){ 
     j = (j+S[i]+key[i%strlen(key)]) %256; 
     S_SWAP(S[i],S[j]); 
    } 

    i = j = 0; 
    for (int k=0;k<strlen(data);k++){ 
     i = (i+1) %256; 
     j = (j+S[i]) %256; 
     S_SWAP(S[i],S[j]); 
     has[k] = data[k]^S[(S[i]+S[j]) %256]; 
    } 
    has[strlen(data)+1] = '\0'; 

} 

void setup() { 
    Serial.begin(9600); 
    char key[] = "Hello"; 
    char sdata[] = "secretMsg"; 

    rc4(key,sdata); 
    Serial.print("Encrypted : "); 

    char out[100]; 
    base64_encode(out,has,strlen(has)); 
    Serial.println(out); 

    char out2[100]; 
    base64_decode(out2,out,strlen(out)); 

    rc4(key,out2); 
    Serial.print("Decrypted : "); 

    Serial.println(has); 

} 

void loop(){ 

} 

PHP

<?php 
    $key = 'Hello'; 
    $msg = 'secretMsg'; 
    $encrypted = rc4_crypt($key, $msg); 

    echo 'encrypted b64: ', base64_encode($encrypted) ,'<br>'; 
    echo "decrip: " , rc4_decrypt($key,rc4_crypt($key, $msg)); 
    exit; 


    function rc4_crypt($key,$msg) { 
      $td = mcrypt_module_open('arcfour', '' , 'stream', ''); 
    mcrypt_generic_init($td, $key, null); 
    $encrypted = mcrypt_generic($td, $msg); 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 
    return $encrypted;   
    } 

    function rc4_decrypt($key,$msg) { 
    return rc4_crypt($key,$msg); 
    } 
    ?> 

回答

1

我有同样的问题,我可以肯定你,你的RC4功能Arduino错了,你可以用这个代替:

unsigned char S[256]; 
unsigned int i, j;  

void swap(unsigned char *s, unsigned int i, unsigned int j) { 
     unsigned char temp = s[i]; 
     s[i] = s[j]; 
     s[j] = temp; 
    } 

    /* KSA */ 
    void rc4_init(unsigned char *key, unsigned int key_length) { 
     for (i = 0; i < 256; i++) 
      S[i] = i; 

     for (i = j = 0; i < 256; i++) { 
      j = (j + key[i % key_length] + S[i]) & 255; 
      swap(S, i, j); 
     } 

     i = j = 0; 
    } 

    /* PRGA */ 
    unsigned char rc4_output() { 
     i = (i + 1) & 255; 
     j = (j + S[i]) & 255; 

     swap(S, i, j); 

     return S[(S[i] + S[j]) & 255]; 
    } 
+0

感谢份额,检查我与我的最后一个工作的实施意见 –

0

这是当前实现,我使用

#define SWAP(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b)) 
class RC4 
{ 
public: 

    RC4() 
    { 
     memset(sbox,0,256); 
     memset(key,0,256); 
    } 
    virtual ~RC4() 
    {       
     memset(sbox,0,256); 
     memset(key,0,256); 
    } 

    char *Encrypt(char *pszText,const char *pszKey) 
    { 
     i=0, j=0,n = 0; 
     ilen = (int)strlen(pszKey); 

     for (m = 0; m < 256; m++) 
     { 
      *(key + m)= *(pszKey + (m % ilen)); 
      *(sbox + m) = m; 
     } 
     for (m=0; m < 256; m++) 
     { 
      n = (n + *(sbox+m) + *(key + m)) &0xff; 
      SWAP(*(sbox + m),*(sbox + n)); 
     } 

     ilen = (int)strlen(pszText); 
     for (m = 0; m < ilen; m++) 
     { 
      i = (i + 1) &0xff; 
      j = (j + *(sbox + i)) &0xff; 
      SWAP(*(sbox+i),*(sbox + j)); 

      k = *(sbox + ((*(sbox + i) + *(sbox + j)) &0xff)); 
      if(k == *(pszText + m))  
       k = 0; 
      *(pszText + m) ^= k; 
     } 

     return pszText; 
    } 

    char *Decrypt(char *pszText,const char *pszKey) 
    { 
     return Encrypt(pszText,pszKey) ; 
    } 

private: 
    unsigned char sbox[256]; 
    unsigned char key[256],k; 
    int m, n, i, j, ilen; 
}; 
; 
相关问题