簡體   English   中英

使用pkcs#7標准的c aes256填充

[英]c aes256 padding with pkcs#7 standard

加密:

while(!feof(fp)){
    memset(plain_text, 0, sizeof(plain_text));
    retval = fread(plain_text, 1, 16, fp);
    if(!retval) break;
    for(i=0; i<16; i++){
        if(plain_text[i] == 0){
            for(j=i; j<16; j++){
                plain_text[j] = 0x0i;
            }
            break;
        }
    }
    gcry_cipher_encrypt(hd, encBuffer, txtLenght, plain_text, txtLenght);
    fwrite(encBuffer, 1, 16, fpout);
}

解密:

while(!feof(fp)){
    memset(plain_text, 0, sizeof(plain_text));
    retval = fread(plain_text, 1, 16, fp);
    if(!retval) break;
    gcry_cipher_decrypt(hd, encBuffer, txtLenght, plain_text, txtLenght);
    for(i=0; i<16; i++){
        if(encBuffer[i] == 0x0i){
            j = 0;
            j += i;
            if(encBuffer[++i] == 0x0j){
                last = 1;
                i--;
                j=i;
                printf("found a %d\n", i);
                break;
            }
            else i--;
        }
    }
    //printf("%d\n", j);
    if(last == 1) fwrite(encBuffer, 1, j, fpout);
    else fwrite(encBuffer, 1, 16, fpout);
}

我正在嘗試從pkcs#7標准中添加可移動的填充,但是我遇到了問題。
如果我使用txt文件,則我的程序可以正常運行,但是如果我嘗試解密 tar.gz或pdf文件,則解密程序將停止在文件大小的一半!
例如,讓我們以tar.gz檔案為例,文件大小為28272字節(證明是原始文件,輸出是加密文件,而origdec是解密文件):

28272   prova
28272   out
12147   origdec

我在gnu / linux上使用libgcrypt!

問題可能出在您不知情的情況下,您正在使用GCC(虛數)中的C語言擴展。 文字0x0i0x0j是虛數文字。 如果對變量使用其他任何名稱,則會出現編譯錯誤。

好像您誤以為數字的表示與數字的表示是一樣的。 在您的程序中,整數文字0x0a是二進制表示形式00001010的表示形式。這意味着您可以直接使用變量ij ,而不必嘗試將它們表示為十六進制數:

plain_text[j] = i;

if(encBuffer[i] == i)

有很多錯誤:

  • 您正在將填充添加到包含零字節的任何塊中。 與文本文件不同,諸如tar.gz之類的二進制文件可能包含許多零字節。 您需要通過查看fread的返回值(該值小於16)並在出現讀取錯誤的情況下檢查錯誤來確定何時讀取了最后一個塊(及其大小)。
  • 當您僅表示i和j時,您正在使用0xi和0xj。
  • 對於PKCS#7,您需要寫入填充字節數作為填充值(16-i),而不是i,即剩余的數據字節。
  • 在解密時,您嘗試以某種方式檢測任何塊中的填充。 這就是為什么您的Decryot矮的原因。 您需要讀取和解密所有密文,然后僅從最后一個塊中刪除填充。

希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM