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

AES CTR对称加密解密

申颖逸
2023-03-14

我不是openssl的专家。我把下面的代码放在一起,使用AES-CTR加密和解密消息。输出不是我期望看到的。

#include "stdafx.h"
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>
#include <psapi.h>
#include <openssl/rand.h> //for RAND_bytes function

struct ctr_state {
    unsigned char ivec[16];  /* ivec[0..7] is the IV, ivec[8..15] is the big-endian counter */
    unsigned int num;
    unsigned char ecount[16];
};

int init_ctr(struct ctr_state *state, const unsigned char iv[8])
{
    /* aes_ctr128_encrypt requires 'num' and 'ecount' set to zero on the
    * first call. */
    state->num = 0;
    memset(state->ecount, 0, 16);
    /* Initialise counter in 'ivec' to 0 */
    memset(state->ivec + 8, 0, 8);
    /* Copy IV into 'ivec' */
    memcpy(state->ivec, iv, 8);
    return(0);
}

int main(int argc, char **argv)
{
    unsigned char key[] = "thiskeyisverybad"; // It is 128bits though..
    unsigned char iv[8];
    struct ctr_state state;
    if (!RAND_bytes(iv, 8))
         printf("\nError in RAND_Bytes...\n");
    init_ctr(&state, iv);
    AES_KEY aes_key;
    AES_set_encrypt_key(key, 128, &aes_key);
    char msg[] = "hey";
    unsigned char cipher[AES_BLOCK_SIZE];
    char plain[AES_BLOCK_SIZE];
    AES_ctr128_encrypt((unsigned char *) msg, cipher, AES_BLOCK_SIZE, &aes_key, state.ivec, state.ecount, &state.num);
    AES_ctr128_encrypt(cipher, (unsigned char *) plain, AES_BLOCK_SIZE, &aes_key, state.ivec, state.ecount, &state.num);
    printf("\nPLAIN:%s\n", plain);
    return 0;
}

我得到的结果是这样的:“简单:、u∩U└■我的

知道是什么导致的吗?我想做的就是使用AES使用CTR来加密和解密消息。我想得到与纯文本相同的加密长度(或1字节)。我用DES做过这个,但是DES不安全。然后,我将使用AES-CTR加密和解密我的流量(流)。

共有1个答案

通啸
2023-03-14

解密前需要重置:

…
init_ctr(&state, iv);
AES_ctr128_encrypt(
        cipher,
        (unsigned char *) plain,
        AES_BLOCK_SIZE,
        &aes_key,
        state.ivec,
        state.ecount,
        &state.num
        );
printf("\nPLAIN:%s\n", plain);
 类似资料:
  • 主要内容:1.对称加密,2.非对称加密,3.混合加密,4.常见的摘要算法1.对称加密 AES,密钥长度有128/256/192。高级加密标准,是下一代的加密算法标准,速度快,安全级别高; DES:密钥为56, 数据加密标准,速度较快,适用于加密大量数据的场合。 3DES: 密钥为168.是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。 IDES: 密钥为128 SM1: 密钥为128 SM4: 密钥为128 RC4, RC5, RC6 DESX 两边用

  • 本文向大家介绍Android对称加密与非对称加密,包括了Android对称加密与非对称加密的使用技巧和注意事项,需要的朋友参考一下 凯撒密码 1. 介绍 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3 的时候,所有的字母

  • 本文向大家介绍C#对称加密与非对称加密实例,包括了C#对称加密与非对称加密实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#对称加密与非对称加密的原理与实现方法,分享给大家供大家参考。具体分析如下: 一、对称加密(Symmetric Cryptography) 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secr

  • 介绍 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,

  • MAC( M essage A uessntication C ode)算法是一种对称密钥加密技术,用于提供消息认证。 为了建立MAC过程,发送方和接收方共享对称密钥K. 实质上,MAC是在基础消息上生成的加密校验和,它与消息一起发送以确保消息验证。 使用MAC进行身份验证的过程如下图所示 - 在Java中, javax.crypto包的Mac类提供了消息认证代码的功能。 按照以下步骤使用此类创建

  • 本文向大家介绍JAVA中AES对称加密和解密过程,包括了JAVA中AES对称加密和解密过程的使用技巧和注意事项,需要的朋友参考一下 AES对称加密和解密代码详细介绍,供大家参考,具体内容如下  测试结果: 使用AES对称加密,请输入加密的规则 使用AES对称加密 请输入要加密的内容: 使用AES对称加密 根据输入的规则使用AES对称加密加密后的密文是:Z0NwrNPHghgXHN0CqjLS58Y