2011-09-30 62 views
1

我已經給出一個樣本加密模塊,其簡單地異或與該分組數據的密鑰並將結果中構建分組本身....變換xorcrypto加密模塊,AES加密模塊

的代碼的數據字段xoricv模塊在這裏。

void 
xorcrypto(uint8_t *key, uint32_t keylen, 
    uint8_t *data, uint32_t datalen) 
{ 
    int d, k; 

    for (d=0, k=0; d < datalen; ++d, k = (k+1)%keylen) { 
      data[d] ^= key[k]; 
    } 
} 

現在我需要更改模塊,以便它執行AES加密而不是簡單的xor操作。

你會建議可能的轉換我需要做嗎?

這是我的項目的一小部分,我被困在...

之間

的AES指令我已經在命令行中使用加密

OpenSSL的ENC -AES-256-CBC - 鹽 - 在file.txt的退房手續file.enc

日報我會進行大量的錯誤,當我試圖通過我自己來實現它,我的時間很有限,所以請幫我.......


這裏是我的實現......雖然我在這裏添加它在答案專欄,因爲可能是我的實現中有一個小錯誤,我可以通過一些有價值的建議來解決,但仍然如果任何其他方式是可能的,請建議並提供我一些實現代碼...描述

/* u_int8_t ... etc all are typedefs for uint8_t....etc 
so don't bother about them */ 

void xorcrypto(u_int8_t *key, u_int32_t keylen,u_int8_t *data, 
       u_int32_t datalen) 
{ 

int ch,i,j; 
uint8_t modata[100]; 

FILE *fp,*fr,*fq,*ft; 

fp=fopen("key","w"); 
fputs((char *)key,fp); 
fq=fopen("file.txt","w"); 
fputs((char *)data,fq); 

fclose(fp); 
fclose(fq); 

system("sudo openssl enc -aes-256-cbc -salt -in file.txt -out file.enc -pass file:key"); 

fr=fopen("file.enc","r"); 

memset(data,0,sizeof(data)); 

i=0; 

while((ch=fgetc(fr))==EOF) { 
    data[i]=ch; 
    i++; 
} 

fclose(fr); 

system("sudo openssl enc -d -aes-256-cbc -salt -in file.enc 
-out file1.txt -pass file:key"); 


ft=fopen("file1.txt","r"); 

memset(modata,0,sizeof(modata)); 

j=0; 

while((ch=fgetc(ft)) != EOF) { 
      modata[j]=ch; 
      j++; 
} 

fclose(ft); 

} 

電話模塊的功能 -

bool 
espcrypto(esp_private *epriv, sendip_data *data, sendip_data *pack) 
{ 
    u_int32_t keylen; 
    u_int8_t *key; 
    static u_int8_t fakekey; 
    struct ip_esp_hdr *esp = (struct ip_esp_hdr *)pack->data; 

    if (!epriv->keylen) { /* This isn't going to be very productive... */ 
      key = &fakekey; 
      keylen = 1; 
    } else { 
      key = (u_int8_t *)epriv->key; 
      keylen = epriv->keylen; 
    } 
    /* Encrypt everything past the ESP header */ 
    xorcrypto(key, keylen, 
      (u_int8_t *)esp->enc_data, 
        pack->alloc_len + data->alloc_len - 
          sizeof(struct ip_esp_hdr)); 
    return TRUE; 
    } 

這是在數據包生成工具xorcrypto.c文件我使用代碼在通過命令行進行數據包構建期間鏈接爲-am xorcrypto.so。這就是爲什麼我很懶惰。我首先尋找可以充當概念驗證的實現。以後可以完成所有優化。

我得到的輸出是 - 加密沒有執行的所有數據仍然是純文本的數據包。

[email protected] ~/Downloads/sendip-2.5-mec-2/mec $ cat file.txt 
[email protected] ~/Downloads/sendip-2.5-mec-2/mec $ cat file.enc 
Salted__���� 
}�#��G�����0����[email protected] ~/Downloads/sendip-2.5-mec-2/mec $ cat file1.txt 
[email protected] ~/Downloads/sendip-2.5-mec-2/mec $ 

爲什麼file.txt的是空連key文件沒有更新???

如果需要其他信息,我會在這裏添加它......但請幫助我離開網格。

+0

如果你想成爲真懶:'系統( 「ENC的OpenSSL -AES-256-CBC -salt -in file.txt的退房手續file.enc」 ); // TODO:refactor' – MSalters

回答

1

好,

我覺得行:

while((ch=fgetc(fr))==EOF) 
// Also, Similar statements that you have used many times. 

您正在從文件讀取1個字符,並進行比較,爲EOF。這工作得很好,直到你正在使用正常的文本文件。

但在這裏你用一個加密文件,file.enc它可以包含任何東西的工作。 它甚至可以擁有EOF字符本身作爲數據內容。

這意味着,如果文件中有100個字符,第2個字符是EOF那麼它會在第2個字符本身終止。

我覺得這是一個可能的問題。

仍然..其他問題 - 我建議使用fprintf()而不是fputs(),這些都很容易使用,因此可以避免看不見的錯誤。因爲你在邏輯上處理字符串而不是字符。

此外,使用這些需要的時候你也可以得到字符串格式化的優勢。

試用,然後回來.. :)

2

如果不對軟件進行一些其他更改,這可能無法實現。它看起來並不像你的函數允許產生的加密數據大於未加密的數據,對於RSA來說,它是必需的。

你傳遞給你函數的關鍵字也會大不相同; RSA密鑰的一端將由模數和指數組成。模數將是一個很大的數字(不能用正常的整數類型來表示),指數通常是一邊是大數字,另一邊是(相對)小數字。

除此之外,RSA還存在一些問題和困難。您可以嘗試自己處理這些問題,但使用OpenSSL等現有庫可能會更好。這些問題包括:

  • 實現RSA(有用的長鍵)需要模數運算非常大的數字,遠遠大於任何正常的整數類型。你要麼必須爲此編寫函數,要麼找到一個庫。
  • 的數據必須被分解成比模量短(鍵的一部分)片段,包括任何填充並且這樣的與數據一起加密。加密後每件的長度將是模數的長度。這就是爲什麼產生的加密數據會比原始數據更長(還有填充)的原因。
  • 避免某些漏洞需要額外的步驟,例如添加隨機填充到每片數據和確保填充數據,從密鑰提升到的指數,將超過模量(如果它不是作爲模冪完成) 。

首先,您需要使您的加密函數能夠返回比您給出的數據更多的數據。那麼你應該看看使用加密庫來進行實際加密,以節省大量工作並減少漏洞漏洞的機會。

+0

你會建議任何其他加密方法,可能在這裏工作......看我在尋找任何加密方法,這將是很好的網絡應用程序,請幫我一些執行code.if任何人都可以工作那麼至少我可以跟隨其他人的工作。 –

+0

我覺得AES會正常工作,如果我沒看錯的.. –

+0

由於RSA也是一種緩慢的,它一般用於少量數據的加密,例如分組密碼算法用於數據的其餘部分的關鍵。 AES可能是一個不錯的選擇,但是使用像OpenSSL這樣的加密庫來完成這項工作仍然是一個好主意,除非你有一個很好的理由必須自己去做。不過,我相信這裏有其他人對這個話題有更多的瞭解,但如果他們中的任何人都願意回答,我會這樣做。 – Dmitri