参考

https://blog.csdn.net/weiyuefei/article/details/72741729

SHA1PRNG与c语言的互通转换,随机数生成

https://blog.csdn.net/diliaolu1763/article/details/101628501

SHA1PRNG

The name of the pseudo-random number generation (PRNG) algorithm supplied by the SUN provider. This algorithm uses SHA-1 as the foundation of the PRNG. It computes the SHA-1 hash over a true-random seed value concatenated with a 64-bit counter which is incremented by 1 for each operation. From the 160-bit SHA-1 output, only 64 bits are used.

java代码

aes.java


//package com.syni.app.utils;//import org.springframework.util.StringUtils;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;/*** 描述:* AES加密解密工具**/
public class AESUtil {private static final String encodeKey = "123456789";private static final String ENCRYPTION_ALGORITHM = "AES";private static final String ENCRYPTION_ALGORITHM_ECB = "AES/ECB/PKCS5Padding";public static String AESEncode(String encodeRules, String content) {//无加密规则值时,使用默认值if (encodeRules == null || "".equals(encodeRules)) {encodeRules = encodeKey;}try {SecureRandom random = SecureRandom.getInstance("SHA1PRNG");random.setSeed(encodeRules.getBytes());//1.构造密钥生成器,指定为AES算法,不区分大小写KeyGenerator keygen = KeyGenerator.getInstance(ENCRYPTION_ALGORITHM);//2.根据ecnodeRules规则初始化密钥生成器//生成一个128位的随机源,根据传入的字节数组keygen.init(128, random);//3.产生原始对称密钥SecretKey original_key = keygen.generateKey();//4.获得原始对称密钥的字节数组byte[] raw = original_key.getEncoded();System.out.println(raw.length);System.out.printf("real key:{");for(int i=0;i<raw.length;i++) {System.out.printf("0x%x", (byte)raw[i]);if(i < raw.length - 1) {System.out.printf(",");}}System.out.printf("}\n");//System.out.println(raw);//5.根据字节数组生成AES密钥SecretKey key = new SecretKeySpec(raw, ENCRYPTION_ALGORITHM);//6.根据指定算法AES自成密码器Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM_ECB);//7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEYcipher.init(Cipher.ENCRYPT_MODE, key);//8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码byte[] byte_encode = content.getBytes("utf-8");//9.根据密码器的初始化方式--加密:将数据加密byte[] byte_AES = cipher.doFinal(byte_encode);//10.将加密后的数据转换为字符串//这里用Base64Encoder中会找不到包//解决办法://在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。//11.将字符串返回return new String(Base64.getEncoder().encode(byte_AES));} catch (Exception e) {return null;}}/* 解密* 解密过程:* 1.同加密1-4步* 2.将加密后的字符串反纺成byte[]数组* 3.将加密内容解密*/public static String AESDncode(String encodeRules, String content) {//无加密规则值时,使用默认值if (encodeRules == null || "".equals(encodeRules)) {encodeRules = encodeKey;}try {SecureRandom random = SecureRandom.getInstance("SHA1PRNG");random.setSeed(encodeRules.getBytes());//1.构造密钥生成器,指定为AES算法,不区分大小写KeyGenerator keygen = KeyGenerator.getInstance(ENCRYPTION_ALGORITHM);//2.根据ecnodeRules规则初始化密钥生成器//生成一个128位的随机源,根据传入的字节数组keygen.init(128, random);//3.产生原始对称密钥SecretKey original_key = keygen.generateKey();//4.获得原始对称密钥的字节数组byte[] raw = original_key.getEncoded();//5.根据字节数组生成AES密钥SecretKey key = new SecretKeySpec(raw, ENCRYPTION_ALGORITHM);//6.根据指定算法AES自成密码器Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM_ECB);//7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEYcipher.init(Cipher.DECRYPT_MODE, key);//8.将加密并编码后的内容解码成字节数组byte[] byte_content = Base64.getDecoder().decode(content);/** 解密*/byte[] byte_decode = cipher.doFinal(byte_content);return new String(byte_decode, "utf-8");} catch (Exception e) {return null;}}}/*
class Hello {public static void main (String args[]){System.out.println("Hello Java,This is my first Java Application!");}
}class person {public static void main(String[] args) {System.out.println("hello");}}
*/class person {public static void main(String[] args ) {AESUtil encode = new AESUtil();String url = "http://192.168.7.101/duilian/small.jpg";String s_e;String ba64;s_e = encode.AESEncode("123456789", url);   System.out.println(url);System.out.println(s_e);s_e = encode.AESDncode("123456789", s_e);System.out.println(s_e);//s_e = "123456";//s_e = new String(Base64.getEncoder().encode(s_e.getBytes()));//System.out.println(s_e);}
}

安装java虚拟机

java版本

java -version
java version "9-ea"

编译

javac aes.java

执行

java person

结果

java person
16
real key:{0xcc,0x67,0x4,0x3c,0x7b,0xcf,0xf5,0xee,0xa5,0x56,0x6b,0xd9,0xb1,0xf3,0xc7,0x4f}
http://192.168.7.101/duilian/small.jpg
FS40WNh8U+YJd9KKCmL2oJu8djSv9Rst8RWj3cbe0/LguNC+6IW3Ut47ck5NXcwl
http://192.168.7.101/duilian/small.jpg

c语言解密

main.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <string.h>unsigned char *base64_encode(unsigned char *str)
{long len;long str_len;unsigned char *res;int i,j;
//定义base64编码表unsigned char *base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//计算经过base64编码后的字符串长度str_len=strlen(str);if(str_len % 3 == 0)len=str_len/3*4;elselen=(str_len/3+1)*4;res=malloc(sizeof(unsigned char)*len+1);res[len]='\0';//以3个8位字符为一组进行编码for(i=0,j=0;i<len-2;j+=3,i+=4){res[i]=base64_table[str[j]>>2]; //取出第一个字符的前6位并找出对应的结果字符res[i+1]=base64_table[(str[j]&0x3)<<4 | (str[j+1]>>4)]; //将第一个字符的后位与第二个字符的前4位进行组合并找到对应的结果字符res[i+2]=base64_table[(str[j+1]&0xf)<<2 | (str[j+2]>>6)]; //将第二个字符的后4位与第三个字符的前2位组合并找出对应的结果字符res[i+3]=base64_table[str[j+2]&0x3f]; //取出第三个字符的后6位并找出结果字符}switch(str_len % 3){case 1:res[i-2]='=';res[i-1]='=';break;case 2:res[i-1]='=';break;}return res;
}unsigned char *base64_decode(unsigned char *code)
{
//根据base64表,以字符找到对应的十进制数据int table[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,63,52,53,54,55,56,57,58,59,60,61,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};long len;long str_len;unsigned char *res;int i,j;//计算解码后的字符串长度len=strlen(code);
//判断编码后的字符串后是否有=if(strstr(code,"=="))str_len=len/4*3-2;else if(strstr(code,"="))str_len=len/4*3-1;elsestr_len=len/4;res=malloc(sizeof(unsigned char)*str_len+1);res[str_len]='\0';//以4个字符为一位进行解码for(i=0,j=0;i < len-2;j+=3,i+=4){res[j]=((unsigned char)table[code[i]])<<2 | (((unsigned char)table[code[i+1]])>>4); //取出第一个字符对应base64表的十进制数的前6位与第二个字符对应base64表的十进制数的后2位进行组合res[j+1]=(((unsigned char)table[code[i+1]])<<4) | (((unsigned char)table[code[i+2]])>>2); //取出第二个字符对应base64表的十进制数的后4位与第三个字符对应bas464表的十进制数的后4位进行组合res[j+2]=(((unsigned char)table[code[i+2]])<<6) | ((unsigned char)table[code[i+3]]); //取出第三个字符对应base64表的十进制数的后2位与第4个字符进行组合}return res;}#define    MAX_URL_SIZE    100#define  ENCRYPT_MAX_SIZE    (MAX_URL_SIZE + AES_BLOCK_SIZE*6)int main(void)
{char userkey[EVP_MAX_KEY_LENGTH] = {0xcc,0x67,0x4,0x3c,0x7b,0xcf,0xf5,0xee,0xa5,0x56,0x6b,0xd9,0xb1,0xf3,0xc7,0x4f};char iv[EVP_MAX_IV_LENGTH];unsigned char *date = malloc(MAX_URL_SIZE);unsigned char *encrypt = malloc(ENCRYPT_MAX_SIZE);unsigned char *plain;// = malloc(ENCRYPT_MAX_SIZE);EVP_CIPHER_CTX ctx;int ret;int tlen = 0;int mlen = 0;int flen = 0;unsigned char *p;int data_len = 0;unsigned char need_encrypt[1024] = "FS40WNh8U+YJd9KKCmL2oJu8djSv9Rst8RWj3cbe0/LguNC+6IW3Ut47ck5NXcwl";int need_encrypt_len;// = strlen(need_encrypt);memset(encrypt, 0, ENCRYPT_MAX_SIZE);strcpy(encrypt, "123456");//p = base64_encode(encrypt);//printf("<%s>\n", p);//p = base64_decode(p);//printf("<%s>\n", p);//memset((void*)userkey, 'k', EVP_MAX_KEY_LENGTH);memset((void*)iv, 'i', EVP_MAX_IV_LENGTH);//memset((void*)date, 'p', MAX_URL_SIZE);strcpy(date, "http://192.168.7.101/duilian/small.jpg");memset((void*)encrypt, 0, ENCRYPT_MAX_SIZE);data_len = strlen(date);/*初始化ctx*/EVP_CIPHER_CTX_init(&ctx);#if 0/*指定加密算法及key和iv(此处IV没有用)*/ret = EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, userkey, iv);if(ret != 1) {printf("EVP_EncryptInit_ex failed\n");exit(-1);}/*禁用padding功能*/EVP_CIPHER_CTX_set_padding(&ctx, 0);/*进行加密操作*/mlen = 0;ret = EVP_EncryptUpdate(&ctx, encrypt, &mlen, date, data_len);if(ret != 1) {printf("EVP_EncryptUpdate failed\n");exit(-1);}#elseret = EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, userkey, NULL);if(ret != 1) {printf("EVP_EncryptInit_ex failed\n");exit(-1);}mlen = 0;ret = EVP_EncryptUpdate(&ctx, encrypt, &mlen, date, data_len);if(ret != 1) {printf("EVP_EncryptUpdate failed\n");exit(-1);}  #endifflen = 0;/*结束加密操作*/ret = EVP_EncryptFinal_ex(&ctx, encrypt+mlen, &flen);if(ret != 1) {printf("EVP_EncryptFinal_ex failed\n");exit(-1);}tlen = mlen + flen;printf("mlen:%d, flen:%d, encry len:%d\n", mlen, flen, tlen);EVP_CIPHER_CTX_cleanup(&ctx);tlen = 0;mlen = 0;flen = 0;
/decode/EVP_CIPHER_CTX_init(&ctx);#if 0ret = EVP_DecryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, userkey, iv);if(ret != 1) {printf("EVP_DecryptInit_ex failed\n");exit(-1);}EVP_CIPHER_CTX_set_padding(&ctx, 0);ret = EVP_DecryptUpdate(&ctx, plain, &mlen, encrypt, AES_BLOCK_SIZE*3);if(ret != 1) {printf("EVP_DecryptUpdate failed\n");exit(-1);}#elseret = EVP_DecryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, userkey, NULL);if(ret != 1) {printf("EVP_DecryptInit_ex failed\n");exit(-1);}data_len = strlen(encrypt);printf("encrypt len:%d\n", data_len);plain = malloc(data_len + AES_BLOCK_SIZE*6);memset((void*)plain, 0, data_len + AES_BLOCK_SIZE*6);if(plain == NULL) {printf("malloc fail here\n");exit(-1);}mlen = 0;ret = EVP_DecryptUpdate(&ctx, plain, &mlen, encrypt, data_len);if(ret != 1) {printf("EVP_DecryptUpdate failed\n");exit(-1);}#endifflen = 0;ret = EVP_DecryptFinal_ex(&ctx, plain+mlen, &flen);if(ret != 1) {printf("EVP_DecryptFinal_ex failed\n");exit(-1);}printf("mlen:%d, flen:%d\n", mlen, flen);data_len = mlen + flen;plain[data_len] = '\0';/*对比解密后与原数据是否一致*/if(!memcmp(plain, date, strlen(plain))) {printf("test success\n");    } else {printf("test failed %d:%d\n", strlen(date), strlen(plain));    printf("encode original:%s\n", date);printf("decode plain:%s\n", plain);}printf("<%s>\n", plain);printf("encrypt: \n");int i;for(i = 0; i < strlen(encrypt); i ++){printf("%.2x ", encrypt[i]);    //printf("%c", encrypt[i]);  if((i+1)%32 == 0){printf("\n");}}printf("\n");p = base64_encode(encrypt);printf("decode is <%s>\n", p);p = base64_decode(need_encrypt);need_encrypt_len = strlen(p);printf("de cry len:%d\n", need_encrypt_len);for(i = 0; i < need_encrypt_len; i ++){printf("%.2x ", p[i]);    //printf("%c", encrypt[i]);  if((i+1)%32 == 0){printf("\n");}}return 0;
}

gcc main.c -o main -lssl -lcrypto

结果

mlen:32, flen:16, encry len:48
encrypt len:48
mlen:32, flen:6
test success
<http://192.168.7.101/duilian/small.jpg>
encrypt:
15 2e 34 58 d8 7c 53 e6 09 77 d2 8a 0a 62 f6 a0 9b bc 76 34 af f5 1b 2d f1 15 a3 dd c6 de d3 f2
e0 b8 d0 be e8 85 b7 52 de 3b 72 4e 4d 5d cc 25
decode is <FS40WNh8U+YJd9KKCmL2oJu8djSv9Rst8RWj3cbe0/LguNC+6IW3Ut47ck5NXcwl>
de cry len:48
15 2e 34 58 d8 7c 53 e6 09 77 d2 8a 0a 62 f6 a0 9b bc 76 34 af f5 1b 2d f1 15 a3 dd c6 de d3 f2
e0 b8 d0 be e8 85 b7 52 de 3b 72 4e 4d 5d cc 25

sha1的key生成

sha1.c

 #include <stdio.h>#include <stdlib.h>#include <string.h>#include <openssl/sha.h>static const char hex_chars[] = "0123456789abcdef";void convert_hex(unsigned char *md, unsigned char *mdstr){int i;int j = 0;unsigned int c;for (i = 0; i < 20; i++) {printf("0x%02x,", md[i]);c = (md[i] >> 4) & 0x0f;mdstr[j++] = hex_chars[c];mdstr[j++] = hex_chars[md[i] & 0x0f];}printf("\n");mdstr[40] = '\0';}int main(int argc, char **argv){SHA_CTX shactx;int i;char data[100] = "123456789";char md[SHA_DIGEST_LENGTH] = {0};char mdstr[40] = {0};char md2[SHA_DIGEST_LENGTH] = {0};SHA1_Init(&shactx);SHA1_Update(&shactx, data, strlen(data));SHA1_Final(md, &shactx);convert_hex(md, mdstr);printf ("SHA_DIGEST_LENGTH:%d, Result of SHA1 : %s\n", SHA_DIGEST_LENGTH, mdstr);bzero(data, sizeof(data));bzero(mdstr, sizeof(mdstr));bzero(md2, sizeof(md2));memcpy(data, md, SHA_DIGEST_LENGTH);SHA1_Init(&shactx);SHA1_Update(&shactx, data, SHA_DIGEST_LENGTH);SHA1_Final(md2, &shactx);printf("{");for(i = 0; i < 16; i++) {printf("0x%02x", (unsigned char)md2[i]);if(i < 15) {printf(",");} }printf("}\n");convert_hex(md2, mdstr);printf ("SHA_DIGEST_LENGTH:%d, Result of SHA1 : %s\n", SHA_DIGEST_LENGTH, mdstr);#if 0bzero(mdstr, sizeof(mdstr));for(i = 0; i < 16; i++) {srand(md[i]);printf("%c,", hex_chars[rand() % 16]);}printf("\n");#endifreturn 0;}

gcc sha1.c -o sha1 -lssl
zengzhihao@kamo:~/encry$ ./sha1
0xf7,0xc3,0xbc,0x1d,0x80,0x8e,0x04,0x73,0x2a,0xdf,0x67,0x99,0x65,0xcc,0xc3,0x4c,0xa7,0xae,0x34,0x41,
SHA_DIGEST_LENGTH:20, Result of SHA1 : f7c3bc1d808e04732adf679965ccc34ca7ae3441
{0xcc,0x67,0x04,0x3c,0x7b,0xcf,0xf5,0xee,0xa5,0x56,0x6b,0xd9,0xb1,0xf3,0xc7,0x4f}
0xcc,0x67,0x04,0x3c,0x7b,0xcf,0xf5,0xee,0xa5,0x56,0x6b,0xd9,0xb1,0xf3,0xc7,0x4f,0xd9,0xa5,0xcf,0x5d,
SHA_DIGEST_LENGTH:20, Result of SHA1 : cc67043c7bcff5eea5566bd9b1f3c74fd9a5cf5

通用

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
#include <unistd.h>
#include <openssl/evp.h>
#include <openssl/aes.h>#define   MAX_ENCODE_KEY_SIZE     100//cipher text size
#define MAX_CIP_SIZE            1024const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";char * base64_encode( const unsigned char * bindata, char * base64, int binlength)
{int i, j;unsigned char current;for ( i = 0, j = 0 ; i < binlength ; i += 3 ){current = (bindata[i] >> 2) ;current &= (unsigned char)0x3F;base64[j++] = base64char[(int)current];current = ( (unsigned char)(bindata[i] << 4 ) ) & ( (unsigned char)0x30 ) ;if ( i + 1 >= binlength ){base64[j++] = base64char[(int)current];base64[j++] = '=';base64[j++] = '=';break;}current |= ( (unsigned char)(bindata[i+1] >> 4) ) & ( (unsigned char) 0x0F );base64[j++] = base64char[(int)current];current = ( (unsigned char)(bindata[i+1] << 2) ) & ( (unsigned char)0x3C ) ;if ( i + 2 >= binlength ){base64[j++] = base64char[(int)current];base64[j++] = '=';break;}current |= ( (unsigned char)(bindata[i+2] >> 6) ) & ( (unsigned char) 0x03 );base64[j++] = base64char[(int)current];current = ( (unsigned char)bindata[i+2] ) & ( (unsigned char)0x3F ) ;base64[j++] = base64char[(int)current];}base64[j] = '\0';return base64;
}int base64_decode( const char * base64, unsigned char * bindata)
{int i, j;unsigned char k;unsigned char temp[4];for ( i = 0, j = 0; base64[i] != '\0' ; i += 4 ){memset( temp, 0xFF, sizeof(temp) );for ( k = 0 ; k < 64 ; k ++ ){if ( base64char[k] == base64[i] )temp[0]= k;}for ( k = 0 ; k < 64 ; k ++ ){if ( base64char[k] == base64[i+1] )temp[1]= k;}for ( k = 0 ; k < 64 ; k ++ ){if ( base64char[k] == base64[i+2] )temp[2]= k;}for ( k = 0 ; k < 64 ; k ++ ){if ( base64char[k] == base64[i+3] )temp[3]= k;}bindata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2))&0xFC)) |((unsigned char)((unsigned char)(temp[1]>>4)&0x03));if ( base64[i+2] == '=' )break;bindata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4))&0xF0)) |((unsigned char)((unsigned char)(temp[2]>>2)&0x0F));if ( base64[i+3] == '=' )break;bindata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6))&0xF0)) |((unsigned char)(temp[3]&0x3F));}return j;
}void get_sha1_key(char *ori, unsigned char *userkey16)
{SHA_CTX shactx;unsigned char  sha1[SHA_DIGEST_LENGTH] = {0};char data[MAX_ENCODE_KEY_SIZE] = {0};int i;bzero(data, sizeof(data));memcpy(data, ori, strlen(ori));bzero(sha1, sizeof(sha1));SHA1_Init(&shactx);SHA1_Update(&shactx, data, strlen(data));SHA1_Final(sha1, &shactx);bzero(data, sizeof(data));memcpy(data, sha1, sizeof(sha1));bzero(sha1, sizeof(sha1));SHA1_Init(&shactx);SHA1_Update(&shactx, data, strlen(data));SHA1_Final(sha1, &shactx);//printf("ori size and key:%d\n\n{%s}\n---------->\n", strlen(ori), ori);printf("key to 16 bytes\n");printf("{%s}\n", ori);printf("---------->\n");printf("{");for(i = 0; i < 16; i++) {userkey16[i] = (unsigned char)sha1[i];printf("0x%02x", userkey16[i]);if(i < 15) {printf(",");}}printf("}\n\n");
}int decrypt_test(char *userkey, unsigned char *ciphertext)
{unsigned char result[MAX_CIP_SIZE] = {0};int ciphertext_len = 0;EVP_CIPHER_CTX ctx;int ret;int i;ciphertext_len = base64_decode((const char*)ciphertext, result);#if 0printf("len:%d\n", ciphertext_len);for(i = 0; i < ciphertext_len; i++) {printf("0x%x ", result[i]);}printf("\n");#endifEVP_CIPHER_CTX_init(&ctx);ret = EVP_DecryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, (const unsigned char *)userkey, NULL);if(ret != 1) {printf("EVP_DecryptInit_ex failed[%s][%d]\n", __FUNCTION__, __LINE__);return -1;}bzero(ciphertext, sizeof(ciphertext));int total_len = 0;int mlen = 0;int flen = 0;ret = EVP_DecryptUpdate(&ctx, ciphertext, &mlen, result, ciphertext_len);if(ret != 1) {printf("EVP_DecryptUpdate failed[%s][%d]\n", __FUNCTION__, __LINE__);return -1;}ret = EVP_DecryptFinal_ex(&ctx, ciphertext+mlen, &flen);if(ret != 1) {printf("EVP_DecryptFinal_ex failed[%s][%d]\n", __FUNCTION__, __LINE__);return -1;}total_len = mlen + flen;ciphertext[total_len] = '\0';//printf("total len:%d, mlen:%d, flen:%d\n", total_len, mlen, flen);//printf("result(%s)\n", ciphertext);return 0;
}int encrypt_test(char *userkey, unsigned char *ori_text)
{unsigned char result[MAX_CIP_SIZE] = {0};int ori_text_len = 0;EVP_CIPHER_CTX ctx;int ret;int i;int tlen = 0;int mlen = 0;int flen = 0;//ciphertext_len = base64_decode((const char*)ciphertext, result);ori_text_len = strlen(ori_text);mlen = 0;flen = 0;EVP_CIPHER_CTX_init(&ctx);ret = EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, (const unsigned char *)userkey, NULL);if(ret != 1) {printf("EVP_EncryptInit_ex failed[%s][%d]\n", __FUNCTION__, __LINE__);return -1;}ret = EVP_EncryptUpdate(&ctx, result, &mlen, ori_text, ori_text_len);if(ret != 1) {printf("EVP_EncryptUpdate failed[%s][%d]\n", __FUNCTION__, __LINE__);return -1;}  /*结束加密操作*/ret = EVP_EncryptFinal_ex(&ctx, result+mlen, &flen);if(ret != 1) {printf("EVP_EncryptFinal_ex failed[%s][%d]\n", __FUNCTION__, __LINE__);exit(-1);}tlen = mlen + flen;//printf("mlen:%d, flen:%d, encrypt len:%d\n", mlen, flen, tlen);EVP_CIPHER_CTX_cleanup(&ctx);bzero(ori_text, MAX_CIP_SIZE);base64_encode(result, ori_text, tlen);return 0;
}int main(int argc, char **argv)
{char key[MAX_ENCODE_KEY_SIZE] = "abcde";char encode_key[20] = {0};char real_cipher[MAX_CIP_SIZE] = "9Av98lYDk1KUD2NTQNJPsdb6pzKAEtORoDqvlej96vTTK7n2s+dzj/l+rvAQV6El";int flag = 0;if(argc != 4) {printf("use default args\n");   } else {if(strstr(argv[1], "en")) {flag = 1; printf("try to encrypt text to cipher\n");    } else {flag = 2;  printf("try to decrypt cipher to text\n");    }bzero(key, sizeof(key));strcpy(key, argv[2]);bzero(real_cipher, sizeof(real_cipher));strcpy(real_cipher, argv[3]);}get_sha1_key(key, encode_key);if((flag == 0) || (flag == 2)) {printf("cipher text to code\n");printf("{%s}\n---------->\n", real_cipher);if(decrypt_test(encode_key, (unsigned char*)real_cipher) == 0) {printf("{%s}\n", real_cipher);} else {printf("decode fail\n");}}if((flag == 0) || (flag == 1)) {printf("\n####################text to ciphter###################\n");printf("{%s}\n---------->\n", real_cipher);if(encrypt_test(encode_key, (unsigned char*)real_cipher) == 0) {printf("{%s}\n", real_cipher);} else {printf("encode fail\n");}}return 0;
}

./e_d de key  cipher

./e_d en key text

java与c互通aes加密解密相关推荐

  1. java php aes加密解密_php aes 加密解密可与java对接

    php aes 加密解密可与java对接 博主:liu1693 发表时间:2017-02-23 16:52:27 浏览量:100 class Encrypt{ //加密方法 public static ...

  2. AES加密解密算法Java实现

    AES加密算法是密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...

  3. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密

    **PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...

  4. aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  5. JAVA与PHP之间进行aes加密解密

    aes加密解密过程 用户数据应经过加密再传输,此文档为aes128加密(cbc模式)的说明 摘要算法为SHA-512 加密: 生成16位iv向量,使用该iv以及密钥加密原文 将加密后的真实密文与iv拼 ...

  6. AES加密解密(java、web、app)

    AES加密解密(java.web.app) AES加密解密(java.web.app) java端 Web端 ios端 AES加密解密(java.web.app) java端 package com. ...

  7. Java AES 加密解密工具类

    maven 引入一个依赖 <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> <depen ...

  8. java nodejs aes_Java与Node.js利用AES加密解密出相同结果的方法示例

    前言 工作中遇到nodejs端通过aes加密,安卓客户端Java解密,同样nodejs也需要解密安卓客户端加密过来的内容,发现两个加密结果不一样,查询资料发现java端需要对密钥再MD5加密一遍,以下 ...

  9. 1、【java数据安全】数据安全之加密解密(base64、MD、SHA、DES、AES、IDEA、PBE、DH、RSA、EIGamal)、数字签名(DSA、ECDSA)和数字证书介绍、应用示例详细介绍

    java数据安全 系列文章 1.[java数据安全]数据安全之加密解密(base64.MD.SHA.DES.AES.IDEA.PBE.DH.RSA.EIGamal).数字签名(DSA.ECDSA)和数 ...

  10. android、ios、php之间AES加密解密

    使用原因: 因为在项目中,需要在与客户端(IOS,Android)交互的时候,保存一些私有信息,不被别人看到,所以,使用了比较流行的可以反向加解密的AES. PHP 源码 <?php$aes = ...

最新文章

  1. 【论文解读】OneNet:一阶段的端到端物体检测器,无需NMS
  2. 设计模式的理解:对23个设计模式的总结
  3. 优秀网页设计各种国外站的素材
  4. SAP Cloud for Customer图片渲染逻辑的调试
  5. Python破解滑块验证码算法,完美避开人机识别
  6. Intellij idea智能提示设置
  7. 为防 Android 碎片化?Google 强迫开发者使用自有开发工具!
  8. ObjectDetecionAPI TypeError: __new__() got an unexpected keyword argument 'serialized_options'
  9. MVVM(维基百科搜索)
  10. 查询某个网址的服务器IP
  11. 如何部署一个属于自己的网站
  12. 有哪些值得长期坚持下去的好习惯?
  13. flutter集成高德地图获取位置
  14. Mapbox GL JS 表达式概述
  15. Unity2D:物体旋转方法
  16. mongod.conf
  17. 2022最新网盘系统源码仿蓝奏
  18. 码云的首次使用—将本地项目上传到码云
  19. iOS 逆向获取手机硬件参数
  20. tfidf处理代码_tf idf公式及sklearn中TfidfVectorizer

热门文章

  1. 【信息通信与软件工程国际会议】2022年第二届信息通信与软件工程国际会议
  2. 英雄联盟怎么解除小窗口_英雄联盟手游剑姬怎么玩-英雄联盟手游剑姬玩法介绍...
  3. 怎么录屏幕视频?教你学会录制屏幕
  4. js逆向学习路线指南
  5. 上海电信路由器有ipv6,电脑无法获取ipv6问题记录
  6. 1538G. Gift Set
  7. 爬取煎蛋网图片(破解js)
  8. PX Deq Credit: send blkd
  9. 计算机导论论文对课程的思考,计算机导论课浅析论文
  10. 使用racoon setkey搭建IPsec VPN环境