首页 文章

使用openssl加密和解密小文件

提问于
浏览
20

我想在C / C中编写一个小程序,它读取一个小文本文件,并使用“内部”键对其进行加密 . 然后我还想写另一个小程序,它可以使用内部相同的密钥解密加密文件 .

我看了一下openSSL网站并用google搜索但发现不是简单的例子,有人试图做过这件事吗?

3 回答

  • 0

    理想情况下,您可以使用现有的工具,如 ccrypt ,但这里是:

    #include <openssl/aes.h>
    
    /* ... */
    
    
    {
      int bytes_read, bytes_written;
      unsigned char indata[AES_BLOCK_SIZE];
      unsigned char outdata[AES_BLOCK_SIZE];
    
      /* ckey and ivec are the two 128-bits keys necesary to
         en- and recrypt your data.  Note that ckey can be
         192 or 256 bits as well */
      unsigned char ckey[] =  "thiskeyisverybad";
      unsigned char ivec[] = "dontusethisinput";
    
      /* data structure that contains the key itself */
      AES_KEY key;
    
      /* set the encryption key */
      AES_set_encrypt_key(ckey, 128, &key);
    
      /* set where on the 128 bit encrypted block to begin encryption*/
      int num = 0;
    
      while (1) {
        bytes_read = fread(indata, 1, AES_BLOCK_SIZE, ifp);
    
        AES_cfb128_encrypt(indata, outdata, bytes_read, &key, ivec, &num,
               AES_ENCRYPT);
    
        bytes_written = fwrite(outdata, 1, bytes_read, ofp);
        if (bytes_read < AES_BLOCK_SIZE)
      break;
      }
    }
    

    通过使用 AES_DECRYPT 作为最后一个参数调用 AES_cfb128_encrypt 来完成解密 . 请注意,此代码除了最基本的测试之外没有给出任何其他内容,并且您确实应该为ckey和ivec使用正确的8位随机数据 .

    EDIT :似乎 AES_cfb128_encrypt 接受任意长度的数据,因此您不需要以 AES_BLOCK_SIZE (16)字节的块加密 .

  • 20

    以前的答案指出了如何做你所要求的 .

    我想补充说明为什么你不应该这样做 .

    您所谈论的内容称为“对称加密”(相同的密钥用于加密和解密,而非对称加密,其中使用一个密钥加密的所有内容只能由特定对应方解密) .

    反汇编可执行文件以确定正在使用的硬编码密钥是琐碎的 . 这意味着,任何能够掌握您的可执行文件的人都可以破解任何已交换的消息的加密 .

    除非您考虑的应用程序非常具体,否则这意味着您的设置可能“看起来”安全,但事实并非如此 . 在这些情况下,通常最好不要加密,这样就没有人因为那种错误的安全感而陷入困境......

    您正在寻找标准库来进行加密(而不是自己实现/创建算法),但协议1(如何使用和交换应用程序,密钥和消息)至少与密码本身一样重要 . 您可能希望由密码学专家测试您的想法,告诉您缺点 . (我在StackOverflow这里有足够的那种 . ;-))

  • 13

    OpenSSL特别关注实现SSL和TLS,SSL和TLS是用于通过网络加密数据的协议 . 由于您只是想加密文件,因此可以使用OpenSSL但不理想 .

    相反,我会使用类似BeeCryptCrypto++® Library 5.6.0的内容,它们都提供了使用它们的示例 .

相关问题