首 页 行业热点 新车 试驾评测 养车用车 车型库

openssl加密数据为8倍数,怎么多出8位

发布网友

我来回答

1个回答

热心网友

从编码规则中我们要使用SHA1、Base、3DES与URLEncoding 四种加密方法并且来回来加密. 我就不都单独拿出来贴代码了,直接贴比较全的代码.
标签: 加密 算法 sha1 base 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 * 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);
0 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{
0 int ret, i, num;
090 uchar cbc_out[512];
091 uchar key1[8], key2[8], key3[8];
092 des_key_schele 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 base+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
1 sha_str = split_byte(sha1, len*2);
165 ret = base_encode_alloc(sha_str, len*2, &digest);
166#else
167 ret = base_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);
1 return NULL;
190 }
191 ret = base_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}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com