繁体   English   中英

OpenSsl + gost引擎解密失败(或加密)

[英]OpenSsl + gost engine decryption fail (or encryption)

我正在尝试编写一个加密 - 解密程序,它使用 gost89 来加密和解密数据。 一切正常,但是当我尝试将 QString 转换为 unsigned char 并将其用作密钥时,程序无法解密。

代码:

#include <cstdio>
#include <iostream>
#include <openssl/conf.h>
#include <openssl/err.h>
#include <openssl/engine.h>
#include <openssl/evp.h>
#include <fstream>
#include <QString>
#include <QDebug>
#include <QFile>

using std::cerr;
using std::endl;

void encryptdata(QString pass, QString data){
    OPENSSL_add_all_algorithms_conf();
    ENGINE *engine_gost = ENGINE_by_id("gost");
    const EVP_CIPHER * cipher_gost = EVP_get_cipherbyname("gost89");
    unsigned char *key = (unsigned char * )"password";



    qDebug() << (char*)key;
    unsigned char * iv = (unsigned char * ) "12345678";
    unsigned char *text = (unsigned char*)"Hello World";

    int text_len = 11;
    unsigned char ciph[512];
    int ciph_len = 0;

    EVP_CIPHER_CTX * ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);

    int init = EVP_EncryptInit_ex(ctx, cipher_gost, engine_gost, key, iv);

    int enc = EVP_EncryptUpdate(ctx, ciph, &ciph_len, text, text_len);

    std::ofstream myfile;
    myfile.open ("example.bin");
    for (int i = 0; i < text_len; i++){
        myfile << ciph[i];
    }
    myfile.close();

    EVP_CIPHER_CTX_free(ctx);
}

void decryptdata(){
    OPENSSL_add_all_algorithms_conf();
    ENGINE *engine_gost1 = ENGINE_by_id("gost");
    const EVP_CIPHER * cipher_gost1 = EVP_get_cipherbyname("gost89");

    unsigned char * key1 = (unsigned char * ) "password";
    qDebug() << (char*)key1;
    unsigned char * iv1 = (unsigned char * ) "12345678";
    unsigned char text1[512];
    int text_len1 = 11;
    unsigned char ciph1[512];
    int ciph_len1 = 0;

    std::ifstream yourfile;
    yourfile.open ("example.bin");
    yourfile >> text1;
    yourfile.close();
    qDebug() << text1;

    EVP_CIPHER_CTX * ctx1 = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx1);

    int init = EVP_DecryptInit_ex(ctx1, cipher_gost1, engine_gost1, key1, iv1);

    int enc = EVP_DecryptUpdate(ctx1, ciph1, &ciph_len1, text1, text_len1);
    //int enc1 = EVP_DecryptFinal(ctx, ciph, &ciph_len);

    for (int i = 0; i < text_len1; i++){
        std::cout << ciph1[i];
    }
    std::cout << std::endl;

    EVP_CIPHER_CTX_free(ctx1);
}

int main(){
    //unsigned char t[512] = {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'};
    QString pss = "password";
    QString dat = "Hello World";
    encryptdata(pss, dat);
    decryptdata();
}

我尝试了很多不同的铸造方法,但它们没有帮助

unsigned char* - 表示它是一组可读/写的字节。

然而,“密码”是const char* - 它是一个只读字符串文字。 将“密码”转换为unsigned char*是危险的。

memory管理和可读/可写memory需要花更多的功夫去理解。

因为您希望它来自 QString,所以我建议执行以下步骤:

  • 考虑使用 QString toUtf8() 将 QString 转换为 QByteArray
  • 考虑 (1) 提供对 QByteArray() 的 unsigned char* 原始访问,例如通过 data() 或 (2) 将其复制到分配的 memory 缓冲区。

终于完成了任务。 是的,问题确实出在我愚蠢的讲师身上,他错误地将字符串转换为 unsigned char。

密钥大小必须正好是 256 位(unsigned char key[32]),否则它会破坏一切。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM