openssl编程

您所在的位置:网站首页 ctr计数器 openssl编程

openssl编程

2024-07-15 12:44| 来源: 网络整理| 查看: 265

计算器模式(Counter (CTR)) 计算器模式不常见,在CTR模式中, 有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是 在计算器不能维持很长的情况下,密钥只能使用一次 。

#include #include #include #include #include #include #include #include // Code example uses partail code from: http://stackoverflow.com/questions/3141860/aes-ctr-256-encryption-mode-of-operation-on-openssl // Mostly in the ctr_ state, and init_ctr functions. struct ctr_state { unsigned char ivec[AES_BLOCK_SIZE]; unsigned int num; unsigned char ecount[AES_BLOCK_SIZE]; }; AES_KEY key; int bytes_read, bytes_written; unsigned char indata[AES_BLOCK_SIZE]; unsigned char outdata[AES_BLOCK_SIZE]; unsigned char iv[AES_BLOCK_SIZE]; //16? struct ctr_state state; int init_ctr(struct ctr_state *state, const unsigned char iv[16]) { /*O aes_ctr128_encrypt exige um 'num' e um 'ecount' definidos a zero na primeira chamada. */ state->num = 0; memset(state->ecount, 0, AES_BLOCK_SIZE); //16? /* Inicilaização do contador no 'ivec' a 0 */ memset(state->ecount, 0, 16); //16? /* Copia o IV para o 'ivec' */ memcpy(state->ivec, iv, 16); //16? } char * TextEncrypt(const unsigned char* enc_key, char * text,int bytes_read) { //Cria vector com valores aleatórios if(!RAND_bytes(iv, AES_BLOCK_SIZE)) { printf("Erro: Não foi possivel criar bytes aleatorios.\n"); exit(1); } //Inicializa a chave de encriptação if (AES_set_encrypt_key(enc_key, 128, &key) < 0) { fprintf(stderr, "Nao foi possível definir chave de encriptacao."); exit(1); } init_ctr(&state, iv); //Chamada do contador // bytes_read = strlen(text); AES_set_encrypt_key(enc_key, 128, &key); //Encripta em blocos de 16 bytes e guarda o texto cifrado numa string -> outdata AES_ctr128_encrypt(text, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num); fflush(stdin); return outdata; } char * TextDecrypt(const unsigned char* enc_key, unsigned char* cypherText,int bytes_read) { //Inicialização da Chave de encriptação if (AES_set_encrypt_key(enc_key, 128, &key) < 0) { fprintf(stderr, "Nao foi possível definir chave de decodificacao."); exit(1); } init_ctr(&state, iv);//Chamada do contador //Encripta em blocos de 16 bytes e escreve o ficheiro output.txt cifrado // bytes_read = strlen(cypherText); AES_set_encrypt_key(enc_key, 128, &key); AES_ctr128_encrypt(cypherText, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num); fflush(stdin); return outdata; } int main(int argc, char *argv[]) { char text [] = "Text test to my program"; //Receive hexadecimal 128 bits key unsigned const char * key = "1234567812345678"; //unsigned const char * key = "9EF4BCDE"; char * cipher, * decrypted; printf("Clean text: %s\n", text); int len = strlen(text); cipher = TextEncrypt(key, text,len); printf("Chiper text: %s\n", cipher); decrypted = TextDecrypt(key, cipher,len); printf("Decrypted text: %s\n", decrypted); getc(stdin); return 0; }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3