2012-02-24 213 views
2

我使用下面的工作代碼解密文件:OpenSSL的命令行來解密AES CTR 128

#include <openssl/aes.h> 
#include <stdio.h> 
#include <string.h> 

struct ctr_state { 
    unsigned char ivec[16]; 
    unsigned int num; 
    unsigned char ecount[16]; 
}; 

FILE *fp; 
FILE *rp; 
FILE *op; 
size_t count; 
char * buffer; 
AES_KEY key; 

int bytes_read, bytes_written; 
unsigned char indata[AES_BLOCK_SIZE]; 
unsigned char outdata[AES_BLOCK_SIZE]; 
unsigned char ckey[] = "123456789"; 
unsigned char iv[8] = {0}; 
struct ctr_state state; 

void init_ctr(struct ctr_state *state, const unsigned char iv[8]){  
    state->num = 0; 
    memset(state->ecount, 0, 16); 
    memset(state->ivec + 8, 0, 8); 
    memcpy(state->ivec, iv, 8); 
} 

void decrypt(){ 
    //Opening files where text cipher text is read and the plaintext recovered   
    rp=fopen("c:\\temp\\decrypted.mp3","wb"); 
    op=fopen("c:\\temp\\encrypted.mp3","rb"); 
    if (rp==NULL) {fputs ("File error",stderr); return;} 
    if (op==NULL) {fputs ("File error",stderr); return;} 

    //Initializing the encryption KEY 
    AES_set_encrypt_key(ckey, 128, &key); 
    init_ctr(&state, iv);//Counter call 

    //Encrypting Blocks of 16 bytes and writing the output.txt with ciphertext 
    while (1) {  
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, op); 
    AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num); 
    bytes_written = fwrite(outdata, 1, bytes_read, rp); 
    if (bytes_read < AES_BLOCK_SIZE) 
    break; 
    } 
    fclose (rp); 
    fclose (op); 
} 

int main(int argc, char *argv[]){ 
    decrypt(); 
    return 0; 
} 

是否有可能使用OpenSSL的命令行做同樣的事情?

AFAIK,沒有-aes-128-ctr密碼,但在openssl中有沒有等價物?

回答

1

我檢查的openssl(1)命令行工具的版本似乎支持任何密碼的計數器模式。

相關問題