今天使用C语言实现了Base64的加密,Base64的理论参考了http://hi.baidu.com/gaojinshan/blog/item/a10d26f82b7b630ad9f9fde2.html的内容,但是实现没有参考,我可以保证。代码比较混乱,大家将就着看吧。
主要方法是base64_encode,它需要两个参数,需要加密的字符串和它的长度(虽然长度也可以在该方法内得到,这一点参考了刚才那个链接的方法。)我都是用的int类型,默认它是4字节32bit的,如果不妥,大家不要责怪。解密以后再做吧。
#include <stdio.h> const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; char* base64_encode(char* data, int data_len); int main(int argc, char* argv[]) { char *t = "你好ma哈哈哈哈哈捏黑的饿登记费ug啊接ia阿尔i阿尔就ijeiie进而饿接ie"; int i = 0; int j = strlen(t); /* for (i=0 ;i<j ;i++ ) { printf("%2X %c/n", *t & 0xFF, *t); t++; } */ //// printf("/n%s/n", base64_encode(t, j)); return 0; } char *base64_encode(char* data, int data_len) { //int data_len = strlen(data); int prepare; int ret_len; int temp = 0; char *ret = NULL; char *f = NULL; int tmp = 0; char changed[4]; int i = 0; ret_len = data_len / 3; temp = data_len % 3; if (temp > 0) { ret_len += 1; } ret = (char *)malloc(ret_len*4 + 1); if ( ret == NULL) { printf("No enough memory./n"); exit(0); } f = ret; while (tmp < data_len) { temp = 0; prepare = 0; memset(changed, '/0', 4); while (temp < 3) { //printf("tmp = %d/n", tmp); if (tmp >= data_len) { break; } prepare = ((prepare << 8) | (data[tmp] & 0xFF)); tmp++; temp++; } prepare = (prepare<<((3-temp)*8)); //printf("before for : temp = %d, prepare = %d/n", temp, prepare); for (i = 0; i < 4 ;i++ ) { if (temp < i) { changed[i] = 0x40; } else { changed[i] = (prepare>>((3-i)*6)) & 0x3F; } *f = base[changed[i]]; //printf("%.2X", changed[i]); f++; } } *f = '/0'; return ret; }
关于“你好ma哈哈哈哈哈捏黑的饿登记费ug啊接ia阿尔i阿尔就ijeiie进而饿接ie”这一串文字,加密结果是:
xOO6w21huf65/rn+uf65/sTzutq1xLb2tce8x7fRdWewob3TaWGworb7abCitvu+zWlqZWlpZb34tvi29r3TaWU=
但是我使用JXTA2.5所带的org.bouncycastle.util.encoders.UrlBase64加密结果稍有出入:
xOO6w21huf65_rn-uf65_sTzutq1xLb2tce8x7fRdWewob3TaWGworb7abCitvu-zWlqZWlpZb34tvi29r3TaWU.
差别在于加减不同,“=”变“.”,“/”变“_”。说起JXTA,我有气,JXTA技术手册都有JXTA的安全方面的类,2.5中没有找到了。