-2

我正在尝试使用 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,因为我的机器在没有那个库的情况下运行)

4

2 回答 2

2

我还没有完全审查你的代码,但这里有一些错误的地方。

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

无论如何,您使用 DES 的事实对安全性不利。DES 早已过时。请改用 AES。

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

一种可能性是使用libtomcrypt手册中有代码示例。如果您只想加密,请在 CBC 或 CTR 模式下使用带有随机 IV/计数器的 AES。如果您还需要身份验证(即检测是否有人修改了密文),请在 GCM 或 CCM 模式下使用 AES(同样,随机 IV)。

于 2015-07-13T23:52:50.940 回答
0

如果您想要可移植的密码学,那么可移植以至于它没有外部依赖项,那么我认为您最好的选择是tweetnacl(如果他们愿意,允许用户使用与 api 兼容的 libsodium)。要加密或解密文件,请参阅该crypto_secretbox()功能。

于 2015-07-13T20:19:52.533 回答