使用AES加密文件

时间:2014-07-04 15:38:23

标签: c encryption struct cryptography openssl

我正在尝试构建一个文件(一个任意大小的EXE)的程序,加密它并将其复制到一个结构。然后再解密,确保使用相同。

我很难加密然后解密文件。它似乎没有正确加密,我不知道如何测试它。

以下是我的问题:

  1. 我在这里做错了什么?
  2. 使用AES加密是否有更好的库?或者我应该坚持使用openSSL
  3. 假设我想用另一个关键词" HelloWorld"。我可以使用该字符串并将其用作加密算法的参数吗?我必须设置密钥的正确位长吗?如果是这样的话?
  4. 代码:

    struct structData{
        unsigned char * FileBuffer;
        unsigned long FileSize;
        //More stuff in here
    };
    
    struct Data sData;
    
    
    /*
     I load the data here, and fill in the data etc
    */
    unsigned char Key[]={ //128bit key
        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
        0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    };
    
    unsigned char *enc_data = malloc(sData->FileSize);//Temporary holder for the File
    
    AES_KEY enc_key;
    AES_set_encrypt_key(Key,128,&enc_key);//Put key defined here
    AES_encrypt(sData->FileBuffer,enc_data,&enc_key);
    sData->FileBuffer = enc_data;//This should move the stuff over
    //Should be encrypted here
    sData->FileBuffer = enc_data;//Copy the output to the file buffer
    free(enc_data);//Free memory
    
    AES_KEY dec_key;
    AES_set_decrypt_key(Key, 128,&dec_key);
    AES_decrypt(sData->FileBuffer,dec_data,&dec_key);
    sData->FileBuffer = dec_data;
    
    free(dec_data);
    

    任何事都会有所帮助,希望我朝着正确的方向前进,我的C技能有点生疏。

2 个答案:

答案 0 :(得分:4)

  

我在这里做错了什么?

嗯,这有点太开放了,无法彻底回答。

从明显的开始,您使用低级AES_*接口并在ECB模式下运行AES。你没有得到你的钥匙。你很难对密钥进行编码。

看起来你也有内存管理问题。您似乎无法在任何地方使用FileSize


  

使用AES加密是否有更好的库?

如果您将使用OpenSSL,那么您应该使用EVP_*接口使用经过身份验证的加密模式(如GCM)。使用GCM模式,您可以获得机密性和真实性。请参阅OpenSSL wiki上的EVP Authenticated Encryption and Decryption


  

让我们说我想用另一个关键词“HelloWorld”。我可以使用该字符串并将其用作加密算法的参数吗?我必须设置密钥的正确位长吗?如果是这样的话?

您应该派生一个密钥而不是直接从密码中使用它。请参阅OpenSSL文档中的EVP_BytesToKey(3)PKCS5_PBKDF2_HMAC(3)(OpenSSL wiki没有文章或示例代码)。


  

......我应该坚持使用OpenSSL

如果您正确使用了库,那么您应该对它感到满意。

否则,您可以使用您喜欢的任何其他库。有关其他选择,请参阅OpenSSL wiki的Related Links页面。

答案 1 :(得分:0)

以下是我使用Javascript进行AES加密的示例。

直播平台为here

AES代码位于here