展会信息港展会大全

openssl实现的加密算法 C++编程
来源:互联网   发布日期:2016-01-26 10:35:49   浏览:2306次  

导读:编码规则:Digest = Base64(SHA1(str1 + $ + TimeStamp)); Result = URLEncoding(ID + $ + Base64(3DES(str1 + $ + TimeStamp + $ + Digest))) 从编码规则中我们要使用SHA1、Base6 ...

编码规则:Digest = Base64(SHA1(str1 + "$" + TimeStamp)); Result = URLEncoding(ID + "$" + Base64(3DES(str1 + "$" + TimeStamp + "$" + Digest))).

从编码规则中我们要使用SHA1、Base64、3DES与URLEncoding 四种加密方法并且来回来加密. 我就不都单独拿出来贴代码了,直接贴比较全的代码.

标签: 加密 算法 sha1 base64 3DES OpenSSL

代码片段(1)

[代码] [C/C++/Objective-C]代码

view source

print?

001/**

002* Creator: WangBin, 2009-11-26

003* For encrypt...

004* I cant't verify those code, What the fuck 0f 3des, Make me always get the different result.Bad thing is the memory, should be careful of those free.

005*

006* Need To Notice: When you get the return NULL, means wrong; Remember free memory you get from the return.

007* How To:

008* 1.Four parameters: str1, ID, TimeStamp, 3DesKey.

009 3DesKey should be initialied as array,like "unsigned char key[24] ={0x2C, 0x7A, 0x0E, 0x98, 0xF1, 0xE0, 0x76, 0x49, 0x73, 0x15, 0xCD, 0x25, 0xE0, 0xB5, 0x43, 0xCB, 0x0E, 0x80, 0x76, 0x01, 0x7F, 0x23, 0x8A, 0x46};"(I needn't convert them). should not be a string!!

010

011* Find some memory leaf, Be sure the proccess context is killed!

012*/

013

014#include

015#include

016#include

017#include

018#include

019#include

020#include

021#include "encrypt.h"

022#define MAX_URL_LEN 2048

023#define DES3_BYTE 8

024#define DES3_PKCS7

025

026typedef unsigned char uchar;

027

028uchar *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

044uchar *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

087int 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/************ugly to get key easily*****************/

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/*

123 for(i = 0; i < num; i++)

124 des_ede3_cbc_encrypt(&(in[16*i]),&(cbc_out[16*i]),16L,ks,ks1,ks2,iv3,enc);

125 des_ede3_cbc_encrypt(&(in[16*i]),&(cbc_out[16*i]),len - num*16,ks,ks1,ks2,iv3,enc); //16位加密

126*/

127 for(i=0 ; i < len ; i++)

128 printf(" %02x",cbc_out[i]);

129 printf("n");

130 free(iv3);

131 return 0;

132}

133/*======================================================================

134 I dont't know what about base64+sha1

135 we use the sha1-array or a new char * from the sha1-array

136 whatever I do the char charges with ugly code

137=======================================================================*/

138uchar *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

149uchar *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}

赞助本站

人工智能实验室

相关热词: 加密算法 openssl C++

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港