Linux中的DES加密

时间:2015-07-13 19:56:02

标签: c linux cryptography des cbc-mode

我正在尝试使用glibc cbc_crypt函数来加密c中的字符串 程序应该像函数一样可移植,这就是我使用这个库的原因

这是我的代码:

#define _GNU_SOURCE
#include <stdio.h>
#include <crypt.h>
#include <string.h>
#include <rpc/des_crypt.h>

int main(int argc, char *argv[]) {
    int blah=0;
    char plaintext[]="mypass1234test";
    char key[]="aBcDeFg1";
    char encbuff[] = "87654321";
    char decbuff[] = "87645321";
    des_setparity(key);
    int size=sizeof(plaintext);
    printf("plaintext is %s\n",plaintext);
    printf("original size is %d\n",size);
    while (size % 8 && size < 420)
        plaintext[size++]='\0';
    printf("new size is %d\n",size);
    if (argc>1) {
        if (strcmp("encrypt",argv[1])==0) {
            blah=cbc_crypt(key,plaintext,size,DES_ENCRYPT | DES_SW,encbuff);
            printf("ciphertext is %s\n",plaintext);
            size = sizeof(plaintext);
            printf("original size is %d\n",size);
            while (size % 8 && size < 420)
                plaintext[size++]='\0';
            printf("new size is %d\n",size);
            blah=cbc_crypt(key,plaintext,size,DES_DECRYPT | DES_SW,decbuff);
            printf("plaintext is %s\n",plaintext);
        }
    }
    return 0;
}

当我尝试运行此程序时,我得到以下内容:

./a.out encryption
plaintext is mypass1234test
original size is 15
new size is 16
ciphertext is 0ю�sBKX,�7&���8@  @
original size is 15
new size is 16
plaintext is myp`rs12��~�ϖ@ @

我的目标是加密文件和解密文件,我打开使用其他加密功能,但我需要这个程序是可移植的(我宁愿不使用openssl,因为我有没有该库运行的机器)

2 个答案:

答案 0 :(得分:2)

我还没有完全审核您的代码,但这里有一些错误。

  • 明文和密文的长度必须是8字节的倍数。 cbc_crypt函数不会为您填充。你正在传递一个15字节的缓冲区;取决于cbc_crypt的工作方式以及您的平台以及编译器今天的感受,这可能会导致另一个变量在某些时候被覆盖。
  • 在明文末尾添加空字节的循环溢出缓冲区。 plaintext只有15个字节的空间,但是您正在编写16.根据您的平台以及编译器今天的感觉,这可能会导致另一个变量在某些时候被覆盖。
  • 在解密时,在密文末尾添加空字节的循环会导致垃圾。这是正常的:“常规”密文在解密时会给你垃圾。 (除了这个循环在数组范围之外写的问题之外,还有。)
  • CBC的IV应该是均匀随机的,而不是恒定的。这不会导致解密无效,但对安全性不利。

无论如何,您使用DES这一事实对安全性有害。 DES已经过时了。请改用AES。

没有标准的加密库,但是有许多库具有非常自由的许可和占用空间小。选择一个并将其代码静态链接到您的代码中。

一种可能性是使用https://blakemesdag.com/blog/2014/11/12/limiting-go-concurrency/libtomcrypt中有代码示例。如果您只想加密,请在CBC或CTR模式下使用AES和随机IV /计数器。如果您还想要验证(即检测是否有人修改了密文),请在GCM或CCM模式下使用AES(再次,随机IV)。

答案 1 :(得分:0)

如果你想要便携式加密,便携式加密而没有外部依赖,那么我认为你最好的选择是tweetnacl(允许用户根据需要使用api兼容的libsodium)。要加密或解密文件,请参阅crypto_secretbox()功能。