Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OpenSSL解密最终错误的最终块长度_C_Encryption_Openssl - Fatal编程技术网

C OpenSSL解密最终错误的最终块长度

C OpenSSL解密最终错误的最终块长度,c,encryption,openssl,C,Encryption,Openssl,我正在使用OpenSSL和C语言制作一个加密和解密应用程序。我有一个头文件(我必须按原样使用,不能修改),它是: #include <openssl/pem.h> #include <openssl/ssl.h> #include <openssl/rsa.h> #include <openssl/evp.h> #include <openssl/bio.h> #include <openssl/err.h> #includ

我正在使用OpenSSL和C语言制作一个加密和解密应用程序。我有一个头文件(我必须按原样使用,不能修改),它是:

#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include <openssl/evp.h>
#include <stdio.h>
#include <stdint.h>

#define CSM_SYM_KEY_MAX_SIZE 1024

typedef uint32_t uint32;
typedef uint16_t uint16;
typedef uint8_t uint8;
typedef uint16 Csm_ConfigIdType;
typedef uint8 Csm_AlignType; 


typedef struct Csm_SymKeyType{
    uint32 length;
    Csm_AlignType data[CSM_SYM_KEY_MAX_SIZE];
} Csm_SymKeyType;

typedef enum Std_ReturnType {
    E_OK,               /*  Request successful  */                   
    E_NOT_OK,           /*  Request failed  */                                  
    CSM_E_BUSY,         /*  Request failed, service is still busy   */          
    CSM_E_SMALL_BUFFER  /*  The provider buffer is too small to store the result    */
} Std_ReturnType;

/* Encryption functions */
Std_ReturnType Csm_SymBlockEncryptStart(Csm_ConfigIdType cfgId,    Csm_SymKeyType *keyPtr);
Std_ReturnType Csm_SymBlockEncryptUpdate(Csm_ConfigIdType cfgId, const uint8 *plaintextPtr, uint32 plainTextLength, 
                                        uint8 *cipherTextPtr, uint32 *plainTextLengthPtr);
Std_ReturnType Csm_SymBlockEncryptFinish(Csm_ConfigIdType cfgId);

/* Decryption functions */
Std_ReturnType Csm_SymBlockDecryptStart(Csm_ConfigIdType cfgId, Csm_SymKeyType *keyPtr);
Std_ReturnType Csm_SymBlockDecryptUpdate(Csm_ConfigIdType cfgId, const uint8 *cipherTextPtr, uint32 cipherTextLength, 
                                        uint8 *plainTextPtr, uint32 *cipherTextLengthPtr);
Std_ReturnType Csm_SymBlockDecryptFinish(Csm_ConfigIdType cfgId);
我知道代码可以写得更好,但这只是一个尝试,我只想让它在这一步工作。 加密是很好的,解密阶段是可变的,有时进行时不会出错,但解密是不正确的(它在结尾添加了一些内容和一些换行):

在执行过程中,有时会出现以下错误:

140614667638424:error:0606506D:digital envelope  routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:581:
Aborted (core dumped)

阅读错误消息时,我认为这与解密的块长度有关,但我反复检查了函数
EVP_DecryptUpdate()
EVP_DecryptFinal()
,我觉得它们很好。有人能帮我解决这个问题吗?提前感谢。

要解密的数据是块大小(AES为16字节)的精确倍数吗?解释“在末尾添加内容”的含义,添加用十六进制解密的最后一个块中的数据。加密数据时是否使用了填充,如果是这样的话?问题可能与使用ciphertext_len(用于存储“cipherTextPtr”数组中放入的字符数的全局变量)和cipherTextLength(main中的一个局部变量,永远不会更新)有关。或者可能是包含文件中的定义误导了您如何编写Csm_SymBlockEncryptUpdate。。。因为它说这些是它的参数:(Csm_ConfigIdType cfgId,const uint8*明文ptr,uint32明文长度,uint8*密文ptr,uint32*明文长度ptr);最后一个参数应该是密文。我想你应该再减少一点。让一切都全球化。发现一些全球性的东西和其他地方性的东西会让人很难了解发生了什么。我不清楚
纯文本
pt\u len
是怎么回事。通常你只需要一个(加上一个临时的)。
ciphertext\u len
ct\u len
也一样。另外,你看过OpenSSL维基吗?这真是太难了。他们甚至以
EVP_aes_256_cbc
为例。我发现问题在于,在完成操作(加密和解密)后,我没有返回密文(以及明文)的最终版本,因此代码中的最终操作是无用的(这是非常错误的)。因此,我必须找到一种方法返回该值,以便在解密过程中进行精确计算。谢谢你的评论和建议。当我在Windows上加密而在Linux上解密时,我遇到了同样的错误。我不知道原因。我可以链接到的问题是:要解密的数据是块大小的精确倍数(AES为16字节)?解释“在末尾添加内容”的含义,添加用十六进制解密的最后一个块中的数据。加密数据时是否使用了填充,如果是这样的话?问题可能与使用ciphertext_len(用于存储“cipherTextPtr”数组中放入的字符数的全局变量)和cipherTextLength(main中的一个局部变量,永远不会更新)有关。或者可能是包含文件中的定义误导了您如何编写Csm_SymBlockEncryptUpdate。。。因为它说这些是它的参数:(Csm_ConfigIdType cfgId,const uint8*明文ptr,uint32明文长度,uint8*密文ptr,uint32*明文长度ptr);最后一个参数应该是密文。我想你应该再减少一点。让一切都全球化。发现一些全球性的东西和其他地方性的东西会让人很难了解发生了什么。我不清楚
纯文本
pt\u len
是怎么回事。通常你只需要一个(加上一个临时的)。
ciphertext\u len
ct\u len
也一样。另外,你看过OpenSSL维基吗?这真是太难了。他们甚至以
EVP_aes_256_cbc
为例。我发现问题在于,在完成操作(加密和解密)后,我没有返回密文(以及明文)的最终版本,因此代码中的最终操作是无用的(这是非常错误的)。因此,我必须找到一种方法返回该值,以便在解密过程中进行精确计算。谢谢你的评论和建议。当我在Windows上加密而在Linux上解密时,我遇到了同样的错误。我不知道原因。我可以链接到的问题:
Plaintext: This is my plaintext!










                                x-gnu/libcrypto.
of length 48
140614667638424:error:0606506D:digital envelope  routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:581:
Aborted (core dumped)