当前位置: 首页 > 知识库问答 >
问题:

aes-256-cbc加密/解密密钥不起作用

都浩淼
2023-03-14

我做了一个简单的文件加密/解密器。它将模式和要操作的文件作为参数。加密时,它生成随机字符串并使用该字符串加密文件。解密文件时,它会提示用户输入密码,并在解密时使用该密码。

我的问题是,解密时得到的不是明文,而是胡言乱语,尽管我小心翼翼地将相同的密钥写入输入。

unsigned char constkey[] = "asd123";

非常感谢James K Polk提供的加密/解密代码!

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <time.h>
#include <errno.h>

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif


/* Encrypt or decrypt, depending on flag 'should_encrypt' */
void en_de_crypt(int should_encrypt, FILE *ifp, FILE *ofp, unsigned char *ckey, unsigned char *ivec) {

    const unsigned BUFSIZE=4096;
    unsigned char *read_buf = malloc(BUFSIZE);
    unsigned char *cipher_buf;
    unsigned blocksize;
    int out_len;
    EVP_CIPHER_CTX ctx;

    EVP_CipherInit(&ctx, EVP_aes_256_cbc(), ckey, ivec, should_encrypt);
    blocksize = EVP_CIPHER_CTX_block_size(&ctx);
    cipher_buf = malloc(BUFSIZE + blocksize);

    while (1) {

        // Read in data in blocks until EOF. Update the ciphering with each read.

        int numRead = fread(read_buf, sizeof(unsigned char), BUFSIZE, ifp);
        EVP_CipherUpdate(&ctx, cipher_buf, &out_len, read_buf, numRead);
        fwrite(cipher_buf, sizeof(unsigned char), out_len, ofp);
        if (numRead < BUFSIZE) { // EOF
            break;
        }
    }

    // Now cipher the final block and write it out.

    EVP_CipherFinal(&ctx, cipher_buf, &out_len);
    fwrite(cipher_buf, sizeof(unsigned char), out_len, ofp);

    // Free memory

    free(cipher_buf);
    free(read_buf);
}

int rand_string(char *str, size_t size)
{
    size_t n;
    const char charset[] = "ABCDEFGHIJKLMNOPQRSTUWVXYZO1234567890";

    for (n = 0; n < size; n++) {
        int key = rand() % (int) (sizeof charset - 1);
        str[n] = charset[key];
    }

    str[size] = '\0';
    return 0;
}

void copyfile(FILE* from, FILE* to)
{
    fseek(from, 0, SEEK_END);
    long filesize = ftell(from);
    fseek(from, 0, SEEK_SET);
    char b[2];
    long a;

    for(a=0; a<filesize; a++)
    {
        fread(b, 1, 1, from);
        fwrite(b, 1, 1, to);
    }
}

int main(int argc, char *argv[]) {

    if (argc != 3) { printf("usage: %s mode file\n", argv[0]); return 0; }

    unsigned char ivec[] = "dontusethisinput";
    FILE *fIN, *fOUT;

    if (!strcmp(argv[1],"e"))
    {
        srand(time(NULL)); /* seed random */

        char passkey[6];
        rand_string(passkey,5); /* generate random password */

        if((fIN = fopen(argv[2], "rb")) == NULL){ printf("ERROR: %s\n", strerror(errno)); return 0; }
        fOUT = fopen("tempfile", "wb+");

        en_de_crypt(TRUE, fIN, fOUT, (unsigned char*)passkey, ivec); /* encrypt the file */

        fclose(fIN);
        fclose(fOUT);

        if((fIN = fopen(argv[2], "wb+")) == NULL){ printf("ERROR: %s\n", strerror(errno)); return 0; }
        fOUT = fopen("tempfile", "rb");

        copyfile(fOUT, fIN); /* replace the file with encrypted one */

        fclose(fIN);
        fclose(fOUT);

        printf("file encrypted with key [%s]\n", passkey);
    }
    else if(!strcmp(argv[1],"d"))
    {
        char key[6];
        printf("Password: ");
        fgets(key, 6, stdin); /* prompt for the key */
        key[5] = '\0';

        if((fIN = fopen(argv[2], "rb")) == NULL){ printf("ERROR: %s\n", strerror(errno)); return 0; }
        fOUT = fopen("tempfile", "wb+");

        en_de_crypt(FALSE, fIN, fOUT, (unsigned char*)key, ivec); /* decrypt the file */

        fclose(fIN);
        fclose(fOUT);

        if((fIN = fopen(argv[2], "wb+")) == NULL){ printf("ERROR: %s\n", strerror(errno)); return 0; }
        fOUT = fopen("tempfile", "rb");

        copyfile(fOUT, fIN); /* replace the file with decrypted one */

        fclose(fIN);
        fclose(fOUT);

        printf("file decrypted with key [%s]\n",key);
    }
    else { printf("invalid mode\n"); return 0; }

    remove("tempfile");
    return 0;
}

共有1个答案

赵选
2023-03-14

我跟踪问题到密码,因为当我使用常量密码时,一切都完美无缺地工作,比如

无符号char constkey[]=“asd123”;

并将其用于加密和解密。

用正确的键长尝试。

 类似资料:
  • 我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/

  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 我在这个网站上用AES-256加密一个虚拟字符串: https://www.devglan.com/online-tools/aes-encryption-decryption 具有以下参数: null 当我尝试用OpenSSL从命令行解密它时: 我得到这个错误:

  • 我是密码学的新手。我的要求是对使用openssl加密/解密的文本进行解密/加密。我们在Openssl中使用的算法是aes-256-cbc。因此,我尝试在我的应用程序中实现相同的功能。到目前为止,在谷歌搜索了很多次之后,我所能做的就是。。 我的openssl命令是 我的密钥长度是32位IV是16位 Thnx...

  • 我遇到的情况是,JSON在PHP的中加密,需要在JAVA中解密。 此包含正确的数据,现在已解密。 现在,问题是当我试图做同样的事情在Java它不起作用:( 这是: 我已经访问了类似的问题,如 AES-256 CBC用php加密,用Java解密,反之亦然 openssl_在java中加密256个CBC原始_数据 无法在Java和PHP之间交换使用AES-256加密的数据 名单还在继续。。。。但是运气