欢迎来到山村网

C++教程:openssl 实现的加密算法

2019-03-02 09:27:31浏览:679 来源:山村网   
核心摘要:编码规则:Digest = Base64(SHA1(str1 + $ + TimeStamp)); Result =URLEncoding(ID + $ + Base64(3DES(str1 + $ + TimeStamp +
编码规则:Digest = base64(SHA1(str1 + "$" + TimeStamp)); Result = URLEncoding(ID + "$" + base64(3DES(str1 + "$" + TimeStamp + "$" + Digest))).
从编码规则中我们要使用SHA1、base64、3DES与URLEncoding 四种加密方法并且来回来加密. 我就不都单独拿出来贴代码了,直接贴比较全的代码.标签: 加密 算法 sha1 base64 3DES OpenSSL

代码片段(1)

view sourceprint? 001 013 014 #include <stdlib.h> 015 #include <string.h> 016 #include <stdio.h> 017 #include <XXX/base64.h> 018 #include <openssl/evp.h> 019 #include <openssl/sha.h> 020 #include <openssl/des.h> 021 #include "encrypt.h" 022 #define MAX_URL_LEN 2048 023 #define DES3_BYTE 8 024 #define DES3_PKCS7 025 026 typedef unsigned char uchar; 027 028 uchar *sha1_encode(uchar *src) 029 { 030 SHA_CTX c; 031 uchar *dest = (uchar *)malloc((SHA_DIGEST_LENGTH + 1)*sizeof(uchar)); 032 memset(dest, 0, SHA_DIGEST_LENGTH + 1); 033 if(!SHA1_Init(&c)) 034 { 035 free(dest); 036 return NULL; 037 } 038 SHA1_Update(&c, src, strlen(src)); 039 SHA1_Final(dest,&c); 040 OPENSSL_cleanse(&c,sizeof(c)); 041 return dest; 042 } 043 044 uchar *inter_string(uchar *s1, uchar *s2, uchar *s3) 045 { 046 uchar *dst, *tmp = NULL; 047 int value; 048 size_t len; 049 if(s3 != NULL) 050 { 051 len = strlen(s1) + strlen(s2) + strlen(s3) + 2; 052 #ifdef DES3_PKCS7 //PKCS7补全法,情goolge.确保3DES加密时是8的倍数 053 value = DES3_BYTE - len%DES3_BYTE; 054 if(value != 0) 055 { 056 tmp = (uchar *)malloc((value + 1)*sizeof(uchar)); 057 memset(tmp, value, value); 058 memset(tmp + value, 0, 1); 059 } 060 #endif 061 len = (DES3_BYTE - len%DES3_BYTE) + len; 062 dst = (uchar *)malloc((len + 1)*sizeof(uchar)); 063 memset(dst, 0, len + 1); 064 strcpy(dst, s1); 065 strcat(dst, "$"); 066 strcat(dst, s2); 067 strcat(dst, "$"); 068 strcat(dst, s3); 069 if(tmp != NULL) 070 strcat(dst, tmp); 071 free(tmp); //free a pointer to NULL..not a bad thing 072 } 073 else 074 { 075 len = strlen(s1) + strlen(s2) + 1; 076 len = (DES3_BYTE - len%DES3_BYTE) + len; 077 dst = (uchar *)malloc((len + 1)*sizeof(uchar)); 078 memset(dst, 0, len + 1); 079 strcpy(dst, s1); 080 strcat(dst, "$"); 081 strcat(dst, s2); 082 } 083 fprintf(stderr, "inter_string = %s, //////line = %dn", dst, __LINE__); 084 return dst; 085 } 086 087 int des_encode(uchar *key, uchar *iv, uchar *in, size_t len, uchar **out, int enc) 088 { 089 int ret, i, num; 090 uchar cbc_out[512]; 091 uchar key1[8], key2[8], key3[8]; 092 des_key_schedule ks,ks1,ks2; 093 des_cblock *iv3; 094 095 memset(key1, 0, 8); 096 memset(key2, 0, 8); 097 memset(key3, 0, 8); 098 memcpy(key1, key, 8); 099 memcpy(key2, key + 8, 8); 100 memcpy(key3, key + 16, 8); 101 if ((ret = DES_set_key_checked((const_DES_cblock*)&key1, &ks)) != 0) 102 { 103 fprintf(stderr, "Key1 error %dn",ret); 104 return -1; 105 } 106 if ((ret = DES_set_key_checked((const_DES_cblock*)&key2, &ks1)) != 0) 107 { 108 fprintf(stderr, "Key2 error %dn",ret); 109 return -1; 110 } 111 if ((ret = DES_set_key_checked((const_DES_cblock*)&key3, &ks2)) != 0) 112 { 113 fprintf(stderr, "Key3 error %dn",ret); 114 return -1; 115 } 116 iv3 = (des_cblock *)malloc(strlen(iv)*sizeof(uchar)); 117 memset(cbc_out,0,512); 118 memcpy(iv3,iv,strlen(iv)); 119 num = len/16; 120 des_ede3_cbc_encrypt(in,cbc_out,len,ks,ks1,ks2,iv3,enc); //cbc算法 121 memcpy(*out, cbc_out, len); 122 127 for(i=0 ; i < len ; i++) 128 printf(" %02x",cbc_out[i]); 129 printf("n"); 130 free(iv3); 131 return 0; 132 } 133 138 uchar *split_byte(uchar *src, size_t len) 139 { 140 int i; 141 uchar tmp, tmp1; 142 uchar *dest = (uchar *)malloc((len + 1)*sizeof(uchar)); 143 memset(dest, 0, len + 1); 144 for(i = 0; i < len/2; i++) 145 sprintf(dest + i*2,"%02x",src[i] & 0x000000ff); 146 fprintf(stderr, "function = %s, ////dest = %s, //////line = %dn", __FUNCTION__, dest, __LINE__); 147 } 148 149 uchar *encrypt_JST(uchar *ID, uchar *str1, uchar *TimeStamp, uchar * key, uchar *iv) 150 { 151 int ret, i; 152 size_t len; 153 uchar *sha1, *sha_str, *digest, *digest1, *encrypt; 154 uchar *des3, *src, *url_str, *url; 155 src = inter_string(str1, TimeStamp, NULL); 156 sha1 = sha1_encode(src); 157 if(!sha1) 158 { 159 free(src); 160 return NULL; 161 } 162 len = strlen(sha1); 163 #ifdef CONVERT_T_STR 164 sha_str = split_byte(sha1, len*2); 165 ret = base64_encode_alloc(sha_str, len*2, &digest); 166 #else 167 ret = base64_encode_alloc(sha1, len, &digest); 168 #endif 169 if(!ret) 170 { 171 free(src); 172 free(sha1); 173 #ifdef CONVERT_T_STR 174 free(sha_str); 175 #endif 176 return NULL; 177 encrypt = (uchar *)malloc(len*sizeof(uchar)); 178 memset(encrypt, 0, len); 179 if(des_encode(key, iv, des3, len, &encrypt, DES_ENCRYPT)) 180 { 181 free(src); 182 free(sha1); 183 #ifdef CONVERT_T_STR 184 free(sha_str); 185 #endif 186 free(des3); 187 free(digest); 188 free(encrypt); 189 return NULL; 190 } 191 ret = base64_encode_alloc(encrypt, len, &digest1); 192 if(!ret) 193 { 194 free(src); 195 free(sha1); 196 #ifdef CONVERT_T_STR 197 free(sha_str); 198 #endif 199 free(des3); 200 free(digest); 201 free(encrypt); 202 return NULL; 203 } 204 fprintf(stderr, "digest1= %s, ////////line = %dn", digest1, __LINE__); 205 url_str = inter_string(ID, digest1, NULL); 206 207 url = (uchar *)malloc(MAX_URL_LEN * sizeof(uchar)); 208 url_encode(url_str, url, MAX_URL_LEN - 1); 209 fprintf(stderr, "ur = %s, ///////line = %dn", url, __LINE__); 210 free(src); 211 free(sha1); 212 #ifdef CONVERT_T_STR 213 free(sha_str); 214 #endif 215 free(des3); 216 free(digest); 217 free(encrypt); 218 free(digest1); 219 free(url_str); 220 return url; 221 }
(责任编辑:豆豆)
下一篇:

C++基础教程-if 语句

上一篇:

windows phone 7中的飞信设计思路

  • 信息二维码

    手机看新闻

  • 分享到
打赏
免责声明
• 
本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们 xfptx@outlook.com