base64编码和解码
C++Base64编码解码、MD5及TEA加密解密

C++Base64编码解码、MD5及TEA加密解密Crypto.h以及Crypto.cppCrypto.h1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86#pragma once#ifndef __CCRYPTO__H__INCLUDED__#define __CCRYPTO__H__INCLUDED__#include <string>using namespace std;#define CONST const#define CLASS class#define AS_PUBLIC#define NEW new#define NULLPTR NULL// BASE64// ⼗六进制数到ASCII表⽰#define HEX_DIGIT_TO_ASCII(x) ((((x) >= 0) && ( (x) <= 9))? (x)+'0': (x)-10+'A') // Encoding and decoding Base64 codeAS_PUBLIC CLASS CryptoBase64{public:// 63rd char used for Base64 codestatic CONST wchar_t CHAR_63 = '*';// 64th char used for Base64 codestatic CONST wchar_t CHAR_64 = '-';// Char used for paddingstatic CONST wchar_t CHAR_PAD = '[';public:// Encodes binary data to Base64 code// Returns size of encoded data.static int Encode(const unsigned char* inData,int dataLength,wstring& outCode);// Decodes Base64 code to binary data// Returns size of decoded data.static int Decode(const wstring& inCode,int codeLength,unsigned char* outData);// Returns maximum size of decoded data based on size of Base64 code. static int GetDataLength(int codeLength);// Returns maximum length of Base64 code based on size of uncoded data. static int GetCodeLength(int dataLength);};/////////////////////////////////////TEA加密//////////////////////////////////////////////////#define ENCODE_SINGATURE (DWORD)0x4B434E45AS_PUBLIC CLASS CryptoTEA{public:/// <summary>/// 使⽤TEA算法加密64bit数据,即8个字节。
base编码解码算法 -回复

base编码解码算法-回复该主题涉及了编码和解码算法中的基本知识,因此我们将根据此主题逐步回答你的问题,并在文章的末尾进行总结。
首先,让我们来讨论什么是编码和解码算法。
在计算机科学中,编码是将一种数据格式转换为另一种数据格式的过程,而解码则是将编码后的数据重新转换为原始数据格式的过程。
编码算法通常用于数据压缩、数据传输和数据存储等场景中。
在编码和解码算法中,base编码和解码算法是一种常见的算法。
它使用固定大小的编码表将数据转换为一组基于数字的字符,以便在不损失数据的情况下减小数据的大小。
换句话说,base编码和解码算法可以将原始数据转换为一组较小的字符,然后通过解码过程重新还原原始数据。
在base编码中,常见的编码表有base64、base32和base16(也称为hex)等。
每个编码表都有一组固定的字符作为编码范围,并根据不同的编码算法将数据转换为这些字符。
现在我们来详细讨论一下base编码和解码算法的步骤。
我们将以base64算法为例进行说明。
1. 首先,将原始数据分割成固定大小的块。
这是为了确保编码和解码的一致性。
2. 对于每个块,将其转换为二进制形式。
3. 然后,将二进制数据划分为固定数量的位组。
4. 在每个位组中,根据编码表将其转换为对应的字符。
5. 将所有的字符连接在一起,即为编码后的数据。
6. 对于解码,首先将编码后的数据分割成相同大小的块。
7. 对于每个块,将其转换为字符形式。
8. 根据编码表,将字符转换回对应的位组。
9. 将所有的位组连接在一起,即为解码后的数据。
接下来,我们将讨论一些base编码算法的应用。
1. 数据传输:在互联网通信中,通过base编码可以将二进制数据转换为可打印字符,以便在不损失数据的情况下进行传输。
例如,电子邮件系统中的附件传输就可以使用base编码来确保数据的完整性。
2. 数据存储:在某些情况下,我们可能需要将二进制数据存储为可读的格式。
通过base编码,我们可以将二进制数据转换为一组可识别的字符,并将其存储在文件或数据库中。
使用Base64将字节数组编码成字符串,或者将字符串解码成字节数组

使⽤Base64将字节数组编码成字符串,或者将字符串解码成字节数组⼀、根据图⽚的url将图⽚读⼊字节输⼊流中,然后将字节输⼊流中的内容读取到字节数组中,再将字节数组通过Base64编码成字符串Map resultMap = new HashMap();List<String> images = new ArrayList<>();//根据采购订单详细获取样本图⽚,转为字节流List<AttachFile> fileList = attachFileService.getFileList(inDetailId, "B_IN_DETAIL", "BIDSAMPLE_IMG");fileList.stream().forEach(file -> {String url = shareFile + "/" + file.getUploadPath() + "/" + file.getCompressedName();try (InputStream in = new BufferedInputStream(new FileInputStream(url))) {byte[] srcBytes = new byte[in.available()];in.read(srcBytes);images.add(Base64.getEncoder().encodeToString(srcBytes));} catch (Exception e) {log.error("图⽚转换流异常:" + e.getMessage());}});resultMap.put("IMAGES", images);return resultMap;⼆、将JSON字符串转换成字节数组,然后将字节数组中的内容通过字节输出流写⼊⽂件中//将字符串转换为byte数组byte[] bytes = Base64.getDecoder().decode(base64.trim());File file = new File(dir + "/" + fileName);FileOutputStream fos = new FileOutputStream(file);BufferedOutputStream bos = new BufferedOutputStream(fos);bos.write(bytes);if (bos != null) {bos.close();}if (fos != null) {fos.close();}引⼊Base64:import java.util.Base64。
python将base64编码解码

python将base64编码解码 本样例旨在解决base64编码的解码,提供了四种场景,希望可以帮到⼤家~# -*- coding:utf-8 -*-#将base64编码/解码包import base64#导⼊url解码包from urllib import parse#普通中⽂s = "你好"#带竖线的中⽂str1 = '中国|陕西省|西安市|雁塔区|⼩寨东路|178号'#base64编码后的样例example = '5Lit5Zu9fOmZleilv+ecgXzopb/lronluIJ86ZuB5aGU5Yy6fOWwj+WvqOS4nOi3r3wxNzjlj7c='#先base64编码,再url编码后的样例example_new = '5Lit5Zu9fOmZleilv%2BecgXzopb%2FlronluIJ86ZuB5aGU5Yy6fOWwj%2BWvqOS4nOi3r3wxNzjlj7c%3D' #场景⼀:普通中⽂base64编码后,得到带有b的编码结果#将字符为unicode编码转换为utf-8编码bs = base64.b64encode(s.encode("utf-8"))#得到的编码结果前带有bprint('带b的编码结果:',bs)#将上⾯带有b的编码结果解码bbs = str(base64.b64decode(bs), "utf-8")#解码print('带b的编码结果解码:',bbs)#场景⼆:将带有竖线(可以没有)的中⽂base64编码后,得到不带b的编码结果bs = str(base64.b64encode(str1.encode("utf-8")), "utf-8")#去掉编码结果前的 bprint('不带b的编码结果:',bs)#将上⾯不带b的编码结果解码bbs = str(base64.b64decode(bs), "utf-8")#解码print('不带b的编码结果解码:',bbs)#场景三:base64编码后的样例的解码bbs = str(base64.b64decode(example), "utf-8")print('base64编码后的样例解码:',bbs) # 解码#场景四:先base64编码,再url编码后的样例的解码str3 = parse.unquote(example_new) #解码字符串print('url解码后:',str3) #str3=haha哈哈bbs = str(base64.b64decode(str3), "utf-8")print('先base64编码,再url编码后的样例的解码:',bbs) # 解码结果:带b的编码结果: b'5L2g5aW9'带b的编码结果解码: 你好不带b的编码结果: 5Lit5Zu9fOmZleilv+ecgXzopb/lronluIJ86ZuB5aGU5Yy6fOWwj+WvqOS4nOi3r3wxNzjlj7c=不带b的编码结果解码: 中国|陕西省|西安市|雁塔区|⼩寨东路|178号base64编码后的样例解码: 中国|陕西省|西安市|雁塔区|⼩寨东路|178号url解码后: 5Lit5Zu9fOmZleilv+ecgXzopb/lronluIJ86ZuB5aGU5Yy6fOWwj+WvqOS4nOi3r3wxNzjlj7c=先base64编码,再url编码后的样例的解码:中国|陕西省|西安市|雁塔区|⼩寨东路|178号。
使用sed命令进行高级文本编码和解码的技巧

使用sed命令进行高级文本编码和解码的技巧在日常的文本处理和编程中,我们经常会遇到需要对文本进行加密和解密的需求。
常见的文本编码和解码方式有很多种,其中一种高级的方式是使用sed命令。
sed命令是一个强大的文本处理工具,可以用来实现对文本的替换、删除、插入等操作。
在本文中,将介绍如何使用sed命令进行高级文本编码和解码的技巧。
1. 使用Base64编码和解码Base64是一种常见的文本编码方式,可以将二进制数据转换为可打印字符,以便在文本中传输和存储。
使用sed命令可以方便地对文本进行Base64编码和解码。
首先,我们来演示如何使用sed命令对文本进行Base64编码:```shellecho "Hello, World!" | base64```输出结果为:```SGVsbG8sIFdvcmxkIQ==```接下来,我们使用sed命令对上述编码结果进行解码:```shellecho "SGVsbG8sIFdvcmxkIQ==" | base64 --decode```输出结果为:```Hello, World!```通过以上示例,我们可以看到sed命令可以简化Base64编码和解码的过程,使得文本处理更加方便和高效。
2. 使用ROT13编码和解码ROT13是一种简单的文本编码方式,可以将一个字母替换成字母表中的第13个字母。
使用sed命令可以轻松地实现ROT13编码和解码。
我们来演示如何使用sed命令对文本进行ROT13编码:```shellecho "Hello, World!" | tr 'A-Za-z' 'N-ZA-Mn-za-m'```输出结果为:```Uryyb, Jbeyq!```接下来,我们使用sed命令对上述编码结果进行解码:```shellecho "Uryyb, Jbeyq!" | tr 'N-ZA-Mn-za-m' 'A-Za-z'```输出结果为:```Hello, World!```通过以上示例,我们可以看到sed命令可以简单地实现ROT13编码和解码,方便快捷。
base编码解码算法 -回复

base编码解码算法-回复进化中的编码解码算法:从BASE64到BASE58简介编码解码算法是计算机科学领域中非常常见的一种算法,用于将数据转换成特定的格式,便于传输和存储。
其中,BASE编码解码算法是一种常见的算法,它被广泛用于网络传输和文件压缩领域。
本文将从BASE64开始,逐步介绍及比较BASE58编码,探讨它们在实际应用中的差异。
1. BASE64编码解码算法BASE64编码算法起源于20世纪70年代,最初用于将二进制数据转换成文本格式,以便在电子邮件中传输。
该算法使用64个可打印的ASCII字符来表示二进制数据,具有编码简单、字符集固定等特点。
编码过程:1. 将输入数据按照8位分组,每组包含6位二进制数据。
2. 将每个6位的二进制数据转换成一个可打印的ASCII字符,共有64个可打印字符作为字典。
3. 如果输入数据的长度不是8的整数倍,需要进行填充操作,通常使用'='字符进行填充。
解码过程:1. 将输入的字符串进行逆向操作,转换成对应的6位二进制数据。
2. 将6位二进制数据重新组合成8位分组。
3. 按照ASCII编码表,将8位二进制数据转换成对应的字符。
BASE64编码解码算法在各种应用场景中得到了广泛采用,包括网络传输、图片文件、邮件附件等等。
然而,由于其字符集中包含了'+', '/'等特殊字符,使得该编码在某些情况下不太适合使用。
比如在URL中传输数据时,需要对这些特殊字符进行URL编码,增加了处理复杂度。
2. BASE58编码解码算法BASE58编码是对BASE64编码的改进和优化,最早用于比特币的地址生成。
它的优势在于去除了BASE64中的一些特殊字符,使得生成的编码更适合用于URL和文件命名等场景。
该算法使用58个字符作为字典,包括大写字母、小写字母和数字。
编码过程:1. 将输入数据按照8位分组,每组包含5位二进制数据。
2. 将每个5位的二进制数据转换成一个可打印的字符,共有58个字符作为字典。
Base64编码解码(源代码)
Base64编码解码(源代码)Base64 Content-Transfer-Encoding ( RFC2045 ) 可对任何⽂件进⾏base64 编解码,主要⽤于MIME邮件内容编解码// 11111100 0xFC // 11000000 0x3 // 11110000 0xF0 // 00001111 0xF // 11000000 0xC0 // 00111111 0x3Fbyte *lmMimeEncodeBase64(const byte *octetSource, int size) { byte *m_Base64_Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";int base64size = (((((size) + 2) / 3) * 4) + 1) / 76 * 78 + 78; //add "/r/n" for each line'byte *strEncode = (byte *)MALLOC(base64size); byte cTemp[4];//By RFC2045 --The encoded output stream must be represented in lines of no more than 76 characters each int LineLength=0; int i, len, j=0;MEMSET(strEncode, 0, base64size);for(i=0; i<size; i+=3) { MEMSET(cTemp,0,4);//cTemp[0]=octetSource[i]; //cTemp[1]=octetSource[i+1]; //cTemp[2]=octetSource[i+2];//len=strlen((char *)cTemp);if(i<size-3){ len = 3; cTemp[0]=octetSource[i]; cTemp[1]=octetSource[i+1]; cTemp[2]=octetSource[i+2]; } else{ len = 0; if(i<size){ cTemp[0]=octetSource[i]; ++len; } if(i<size-1){cTemp[1]=octetSource[i+1]; ++len; } if(i<size-2){ cTemp[2]=octetSource[i+2]; ++len; } //DBGPRINTF("temp[0] = %d", cTemp[0]); //DBGPRINTF("temp[1] = %d", cTemp[1]); //DBGPRINTF("temp[2] = %d",cTemp[2]); //DBGPRINTF("strEncode[0] = %d", ((int)cTemp[0] & 0xFC)>>2); //DBGPRINTF("strEncode[1] = %d",((int)cTemp[0] & 0x3)<<4 | ((int)cTemp[1] & 0xF0)>>4); //DBGPRINTF("strEncode[2] = %d", ((int)cTemp[1] & 0xF)<<2 | ((int)cTemp[2] & 0xC0)>>6); //DBGPRINTF("strEncode[3] = %d", (int)cTemp[2] & 0x3F); //DBGPRINTF("strEncode[0] = %c",m_Base64_Table[((int)cTemp[0] & 0xFC)>>2]); //DBGPRINTF("strEncode[1] = %c", m_Base64_Table[((int)cTemp[0] & 0x3)<<4 | ((int)cTemp[1] & 0xF0)>>4]); //DBGPRINTF("strEncode[2] = %c", m_Base64_Table[((int)cTemp[1] & 0xF)<<2 | ((int)cTemp[2] &0xC0)>>6]); //DBGPRINTF("strEncode[3] = %c", m_Base64_Table[(int)cTemp[2] & 0x3F]); }if(len==3) { strEncode[j++] = m_Base64_Table[((int)cTemp[0] & 0xFC)>>2]; strEncode[j++] =m_Base64_Table[((int)cTemp[0] & 0x3)<<4 | ((int)cTemp[1] & 0xF0)>>4]; strEncode[j++] = m_Base64_Table[((int)cTemp[1] & 0xF) <<2 | ((int)cTemp[2] & 0xC0)>>6]; strEncode[j++] = m_Base64_Table[(int)cTemp[2] & 0x3F]; LineLength+=4;if(LineLength>=76) {strEncode[j++]='/r'; strEncode[j++]='/n'; LineLength=0;} } else if(len==2) { strEncode[j++] =m_Base64_Table[((int)cTemp[0] & 0xFC)>>2]; strEncode[j++] = m_Base64_Table[((int)cTemp[0] & 0x3 )<<4 | ((int)cTemp[1] & 0xF0 )>>4]; strEncode[j++] = m_Base64_Table[((int)cTemp[1] & 0x0F)<<2]; strEncode[j++] = '='; LineLength+=4;if(LineLength>=76) {strEncode[j++]='/r'; strEncode[j++]='/n'; LineLength=0;} } else if(len==1) { strEncode[j++] =m_Base64_Table[((int)cTemp[0] & 0xFC)>>2]; strEncode[j++] = m_Base64_Table[((int)cTemp[0] & 0x3 )<<4]; strEncode[j++] = '='; strEncode[j++] = '='; LineLength+=4; if(LineLength>=76) {strEncode[j++]='/r'; strEncode[j++]='/n'; LineLength=0;} } memset(cTemp,0,4); } //strEncode[j] = '/0'; //DBGPRINTF("--finished encode base64size = %d, j = %d", base64size, j); //for(i=j; i<base64size; i++){ // DBGPRINTF("--rest char is: %c", strEncode[i]); //} return strEncode; }byte GetBase64Value(char ch) { if ((ch >= 'A') && (ch <= 'Z')) return ch - 'A'; if ((ch >= 'a') && (ch <= 'z')) return ch - 'a' + 26; if ((ch >= '0') && (ch <= '9')) return ch - '0' + 52; switch (ch) { case '+': return 62; case '/': return 63; case '=': /* base64 padding */ return 0; default: return 0; } } byte *lmMimeDecodeBase64(const byte *strSource, int *psize) { byte *m_Base64_Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int i, j, k, size = STRLEN((char *)strSource); int n = 0; //return value byte *octetDecode = (byte *)MALLOC( (((size) - 1) / 4) *3 ); byte cTemp[5]; int Length=0; int asc[4];for(i=0;i<size;i+=4) { MEMSET(cTemp,0,5);cTemp[0]=strSource[i]; cTemp[1]=strSource[i+1]; cTemp[2]=strSource[i+2]; cTemp[3]=strSource[i+3];Length+=4; if(Length==76) { i+=2; Length=0; }for(j=0;j<4;j++) { //if(cTemp[j]=='='){ // asc[j]=0; //}else{ for(k=0;k<(int)STRLEN((char*)m_Base64_Table);k++) { if(cTemp[j]==m_Base64_Table[k]) asc[j]=k; } //} } if('='==cTemp[2] && '='==cTemp[3]) { octetDecode[n++] = (byte)(int)(asc[0] << 2 | asc[1] << 2 >> 6); } else if('='==cTemp[3]) { octetDecode[n++] = (byte)(int)(asc[0] << 2 | asc[1] << 2 >> 6); octetDecode[n++] = (byte)(int)(asc[1] << 4 | asc[2] << 2 >> 4); } else { octetDecode[n++] = (byte)(int)(asc[0] << 2 | asc[1] << 2 >> 6); octetDecode[n++] = (byte)(int)(asc[1] << 4 | asc[2] << 2 >> 4); octetDecode[n++] = (byte)(int)(asc[2] << 6 | asc[3] << 2 >> 2); }//cTemp[0] = GetBase64Value((char)strSource[i]); //cTemp[1] = GetBase64Value((char)strSource[i+1]); //cTemp[2] = GetBase64Value((char)strSource[i+2]); //cTemp[3] = GetBase64Value((char)strSource[i+3]);//Length+=4; //if(Length==76) //{ // i+=2; // Length=0; //}//octetDecode[n++] = (cTemp[0] << 2) | (cTemp[1] >> 4); //octetDecode[n++] = (cTemp[1] << 4) | (cTemp[2] >> 2); //octetDecode[n++] = (cTemp[2] << 6) | (cTemp[3]);} *psize = n; return octetDecode; }。
各种格式的编码解码工具类分享(hex解码base64编码)
各种格式的编码解码⼯具类分享(hex解码base64编码)复制代码代码如下:import java.io.UnsupportedEncodingException;import .URLDecoder;import .URLEncoder;import mons.codec.DecoderException;import mons.codec.binary.Base64;import mons.codec.binary.Hex;import ng.StringEscapeUtils;/*** 各种格式的编码加码⼯具类.** 集成Commons-Codec,Commons-Lang及JDK提供的编解码⽅法.***/public class EncodeUtils {private static final String DEFAULT_URL_ENCODING = "UTF-8";/*** Hex编码.*//*public static String hexEncode(byte[] input) {return Hex.encodeHexString(input);}*//*** Hex解码.*/public static byte[] hexDecode(String input) {try {return Hex.decodeHex(input.toCharArray());} catch (DecoderException e) {throw new IllegalStateException("Hex Decoder exception", e);}}/*** Base64编码.*/public static String base64Encode(byte[] input) {return new String(Base64.encodeBase64(input));}/*** Base64编码, URL安全(将Base64中的URL⾮法字符�?,/=转为其他字符, 见RFC3548).*/public static String base64UrlSafeEncode(byte[] input) {return Base64.encodeBase64URLSafeString(input);}/*** Base64解码.*/public static byte[] base64Decode(String input) {return Base64.decodeBase64(input);}/*** URL 编码, Encode默认为UTF-8.*/public static String urlEncode(String input) {try {return URLEncoder.encode(input, DEFAULT_URL_ENCODING);} catch (UnsupportedEncodingException e) {throw new IllegalArgumentException("Unsupported Encoding Exception", e); }}/*** URL 解码, Encode默认为UTF-8.*/public static String urlDecode(String input) {try {return URLDecoder.decode(input, DEFAULT_URL_ENCODING);} catch (UnsupportedEncodingException e) {throw new IllegalArgumentException("Unsupported Encoding Exception", e); }}/*** Html 转码.*/public static String htmlEscape(String html) {return StringEscapeUtils.escapeHtml(html);}/*** Html 解码.*/public static String htmlUnescape(String htmlEscaped) {return StringEscapeUtils.unescapeHtml(htmlEscaped);}/*** Xml 转码.*/public static String xmlEscape(String xml) {return StringEscapeUtils.escapeXml(xml);}/*** Xml 解码.*/public static String xmlUnescape(String xmlEscaped) {return StringEscapeUtils.unescapeXml(xmlEscaped);}}。
javascript实现base64格式转码与解码
javascript实现base64格式转码与解码 最近碰到⼀个需求,后端返回base64格式的数据,前端需要进⾏base64格式解码,好了,前端采⽤内部提供的atob函数进⾏解码,开完成,交付测试,然后测试⼩哥哥⼩姐姐反馈说中⽂乱码! 然后查了⼀下,我后端代码采⽤utf8编码,这没问题,问题出在前端使⽤的atob函数,它居然采⽤的是Latin1(ISO-8859-1)编码!还不能修改编码⽅式,⽽且它还只在web端开发有这个atob函数!也不知道写这个atob函数的作者出于什么⽬的,Latin1(ISO-8859-1)编码⽤的很⼴么?竖中指 没办法,问题要解决,我们本可以找⼀下第三⽅的包,但想想,还是觉的⾃⼰实现⼀个转码的函数,留着备⽤,这⾥分享出来:let base64util = function () {let _keys = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";//base64格式加密function encode(input) {if (typeof input != "string") {input = JSON.stringify(input)}//utf8转码,Unicode值转换为字节数组let buffer = [];for (var n = 0; n < input.length; n++) {var c = input.charCodeAt(n);if (c < 128) { //⼀个字节buffer.push(c);} else if (c < 2048) { //两个字节buffer.push((c >> 6) | 192, (c & 63) | 128);} else if (c < 65536) { //三个字节buffer.push((c >> 12) | 224, ((c >> 6) & 63) | 128, (c & 63) | 128);} else if (c < 2097152) { //四个字节buffer.push((c >> 18) | 240, ((c >> 12) & 63) | 128, ((c >> 6) & 63) | 128, (c & 63) | 128);} else if (c < 67108864) { //五个字节buffer.push((c >> 24) | 248, ((c >> 18) & 63) | 128, ((c >> 12) & 63) | 128, ((c >> 6) & 63) | 128, (c & 63) | 128);} else { //六个字节buffer.push((c >> 30) | 252, ((c >> 24) & 63) | 128, ((c >> 18) & 63) | 128, ((c >> 12) & 63) | 128, ((c >> 6) & 63) | 128, (c & 63) | 128);}}//转码,三字节转换成四字节let i = 0, padding = buffer.length % 3;padding && buffer.push(...new Array(padding = 3 - padding).fill(0));//先⽤0填补let result = []while (i < buffer.length) {let [c1, c2, c3] = [buffer[i++], buffer[i++], buffer[i++]];result.push(c1 >> 2, ((c1 & 0b11) << 4) | (c2 >> 4), ((c2 & 0b1111) << 2) | (c3 >> 6), c3 & 63);}padding && (result.splice(result.length - padding), result.push(...new Array(padding).fill(64)));//把0填补换成=return result.map(v => _keys.charAt(v)).join("");}//base64格式解码function decode(input) {if (typeof input != "string") {throw "invalid argument"}//解码,四字节转换成三字节let buffer = input.split(""), i = 0, padding;let r = []while (i < buffer.length) {let array = buffer.slice(i, i += 4).map(v => _keys.indexOf(v))if (array.length != 4 || array.some(v => v < 0)) throw "invalid input"padding = array.filter(v => v == 64).length;//获取填补的=号数量padding && (array.splice(r.length - padding), array.push(...new Array(padding).fill(0)));//把=填补换成0let [e1, e2, e3, e4] = arrayr.push((e1 << 2) | (e2 >> 4), ((e2 & 15) << 4) | (e3 >> 2), ((e3 & 3) << 6) | e4);}padding && r.splice(r.length - padding)//去掉填补//utf8转码,字节数组转换成Unicode值i = 0;buffer = [];while (i < r.length) {let c = r[i++]if (c < 128) //⼀个字节buffer.push(c);else if (c < 224) //两个字节buffer.push(((c & 31) << 6) | (r[i++] & 63));else if (c < 240) //三个字节buffer.push(((c & 15) << 12) | ((r[i++] & 63) << 6) | (r[i++] & 63));else if (c < 248) //四个字节buffer.push(((c & 7) << 18) | ((r[i++] & 63) << 12) | ((r[i++] & 63) << 6) | (r[i++] & 63));else if (c < 252) //五个字节buffer.push(((c & 3) << 24) | ((r[i++] & 63) << 18) | ((r[i++] & 63) << 12) | ((r[i++] & 63) << 6) | (r[i++] & 63));else//六个字节buffer.push(((c & 1) << 30) | ((r[i++] & 63) << 25) | ((r[i++] & 63) << 18) | ((r[i++] & 63) << 12) | ((r[i++] & 63) << 6) | (r[i++] & 63)); }return buffer.map(v => String.fromCharCode(v)).join("");}return { encode, decode };}() 使⽤: //转码base64util.encode("say:上⼭打⽼虎")//解码base64util.decode("c2F5OuS4iuWxseaJk+iAgeiZjg==") 结果:。
【VBA研究】如何用Base64编解码方法实现简单的加解密
【VBA研究】如何⽤Base64编解码⽅法实现简单的加解密Base64编码的思想是是采⽤64个基本的ASCII码字符对数据进⾏重新编码,将数据变成字符串实现⽂本传输。
由于编码简单,所以很容易实现,代码也是现成的。
利⽤这个编码规则可以实现简单的加解密。
编解码⽅法见: VB实现Base64 编解码我⽤VBA做了个简单的系统,其中⽤到⽤户登录,⾃然要保存⽤户名和密码。
密码存放在数据库中,不想明码保存,于是就想到⽤这个编码⽅法进⾏加密。
Base64编码是按照64个字符字典进⾏编码的,为了加密,这64个字符可以打乱原来的顺序,也可以⽤其他字符替换掉部分字符,如果不考虑解码,这个字符字典中的字符甚⾄可以重复。
⽐如密码保存,只需⽐较密⽂,不需要还原成明⽂进⾏⽐较,那么字符字典中重复也是没有问题的,可以任意取64个字符作为字典。
下⾯这个函数就可以⽤来⽣成密码的密⽂,其中的数据字典是⽤个随机函数随意⽣成的:Function B64Encode(sou_str As String) As String 'Base64 编码On Error GoTo over '排错Dim buf() As Byte, length As Long, mods As LongDim Str() As Byte, kk As Long, i As Long'字符字典(⽤随机产⽣的)Const B64_CHAR_DICT = "Qx7mCcL2XsYm!Q^ZjKeLn#r2H4rV6B(Xu$v$zU2@CnHfVf7tH9XrBcB9WyA6F%Ah."kk = Len(sou_str) - 1ReDim Str(kk)For i = 0 To kkStr(i) = Asc(Mid(sou_str, i + 1, 1))Next imods = (UBound(Str) + 1) Mod 3 '除以3的余数length = UBound(Str) + 1 - modsReDim buf(length / 3 * 4 + IIf(mods <> 0, 4, 0) - 1)For i = 0 To length - 1 Step 3buf(i / 3 * 4) = (Str(i) And &HFC) / &H4buf(i / 3 * 4 + 1) = (Str(i) And &H3) * &H10 + (Str(i + 1) And &HF0) / &H10buf(i / 3 * 4 + 2) = (Str(i + 1) And &HF) * &H4 + (Str(i + 2) And &HC0) / &H40buf(i / 3 * 4 + 3) = Str(i + 2) And &H3FNextIf mods = 1 Thenbuf(length / 3 * 4) = (Str(length) And &HFC) / &H4buf(length / 3 * 4 + 1) = (Str(length) And &H3) * &H10buf(length / 3 * 4 + 2) = 64buf(length / 3 * 4 + 3) = 64ElseIf mods = 2 Thenbuf(length / 3 * 4) = (Str(length) And &HFC) / &H4buf(length / 3 * 4 + 1) = (Str(length) And &H3) * &H10 + (Str(length + 1) And &HF0) / &H10buf(length / 3 * 4 + 2) = (Str(length + 1) And &HF) * &H4buf(length / 3 * 4 + 3) = 64End IfFor i = 0 To UBound(buf)B64Encode = B64Encode + Mid(B64_CHAR_DICT, buf(i) + 1, 1)Nextover:End Function'调⽤测试Private Sub ttt()aa = B64Encode("iamlaosong")bb = B64Encode("iamlaosong")MsgBox aa & " " & bbEnd Sub关于随机字符串的产⽣,见:【VBA研究】⽣成随机密码---------------------。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
'501 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base64编码。
'下面简单介绍Base64算法的原理,由于代码太长就不在此贴出 'Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
'转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的: '0 A 17 R 34 i 51 z '1 B 18 S 35 j 52 0 '2 C 19 T 36 k 53 1 '3 D 20 U 37 l 54 2 '4 E 21 V 38 m 55 3 '5 F 22 W 39 n 56 4 '6 G 23 X 40 o 57 5 '7 H 24 Y 41 p 58 6 '8 I 25 Z 42 q 59 7 '9 J 26 a 43 r 60 8 '10 K 27 b 44 s 61 9 '11 L 28 c 45 t 62 + '12 M 29 d 46 u 63 / '13 N 30 e 47 v '14 O 31 f 48 w (pad) = '15 P 32 g 49 x '16 Q 33 h 50 y '原文的字节最后不够3个的地方用0来补足,转换时Base64编码用=号来代替。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。 '举一个例子,abc经过Base64编码以后的结果是YWJj. ' '发邮件的时候所写的信息自动在后台转换然后传输... 创建一个新类,即可调用该类的加密和解密方法 Option Explicit
'Base64编码函数:Base64Encode 'Instr1 编码前字符串 'Outstr1 编码后字符串 Public Function Base64Encode(InStr1 As String) As String Dim mInByte(3) As Byte, mOutByte(4) As Byte Dim myByte As Byte Dim i As Integer, LenArray As Integer, j As Integer Dim myBArray() As Byte Dim OutStr1 As String
myBArray() = StrConv(InStr1, vbFromUnicode) LenArray = UBound(myBArray) + 1 For i = 0 To LenArray Step 3 If LenArray - i = 0 Then Exit For End If If LenArray - i = 2 Then mInByte(0) = myBArray(i) mInByte(1) = myBArray(i + 1) Base64EncodeByte mInByte, mOutByte, 2 ElseIf LenArray - i = 1 Then mInByte(0) = myBArray(i) Base64EncodeByte mInByte, mOutByte, 1 Else mInByte(0) = myBArray(i) mInByte(1) = myBArray(i + 1) mInByte(2) = myBArray(i + 2) Base64EncodeByte mInByte, mOutByte, 3 End If For j = 0 To 3 OutStr1 = OutStr1 & Chr(mOutByte(j)) Next j Next i Base64Encode = OutStr1 End Function Private Sub Base64EncodeByte(mInByte() As Byte, mOutByte() As Byte, Num As Integer) Dim tByte As Byte Dim i As Integer
If Num = 1 Then mInByte(1) = 0 mInByte(2) = 0 ElseIf Num = 2 Then mInByte(2) = 0 End If tByte = mInByte(0) And &HFC mOutByte(0) = tByte / 4 tByte = ((mInByte(0) And &H3) * 16) + (mInByte(1) And &HF0) / 16 mOutByte(1) = tByte tByte = ((mInByte(1) And &HF) * 4) + ((mInByte(2) And &HC0) / 64) mOutByte(2) = tByte tByte = (mInByte(2) And &H3F) mOutByte(3) = tByte For i = 0 To 3 If mOutByte(i) >= 0 And mOutByte(i) <= 25 Then mOutByte(i) = mOutByte(i) + Asc("A") ElseIf mOutByte(i) >= 26 And mOutByte(i) <= 51 Then mOutByte(i) = mOutByte(i) - 26 + Asc("a") ElseIf mOutByte(i) >= 52 And mOutByte(i) <= 61 Then mOutByte(i) = mOutByte(i) - 52 + Asc("0") ElseIf mOutByte(i) = 62 Then mOutByte(i) = Asc("+") Else mOutByte(i) = Asc("/") End If Next i If Num = 1 Then mOutByte(2) = Asc("=") mOutByte(3) = Asc("=") ElseIf Num = 2 Then mOutByte(3) = Asc("=") End If End Sub
Public Function Base64Decode(InStr1 As String) As String Dim mInByte(4) As Byte, mOutByte(3) As Byte Dim i As Integer, LenArray As Integer, j As Integer Dim myBArray() As Byte Dim OutStr1 As String Dim tmpArray() As Byte myBArray() = StrConv(InStr1, vbFromUnicode) LenArray = UBound(myBArray) ReDim tmpArray(((LenArray + 1) / 4) * 3) j = 0
For i = 0 To LenArray Step 4 If LenArray - i = 0 Then Exit For Else mInByte(0) = myBArray(i) mInByte(1) = myBArray(i + 1) mInByte(2) = myBArray(i + 2) mInByte(3) = myBArray(i + 3) Base64DecodeByte mInByte, mOutByte, 4 End If tmpArray(j * 3) = mOutByte(0) tmpArray(j * 3 + 1) = mOutByte(1) tmpArray(j * 3 + 2) = mOutByte(2) j = j + 1 Next i Base64Decode = BinaryToString(tmpArray) End Function
Private Sub Base64DecodeByte(mInByte() As Byte, mOutByte() As Byte, ByteNum As Integer) Dim tByte As Byte Dim i As Integer ByteNum = 0 For i = 0 To 3 If mInByte(i) >= Asc("A") And mInByte(i) <= Asc("Z") Then mInByte(i) = mInByte(i) - Asc("A") ElseIf mInByte(i) >= Asc("a") And mInByte(i) <= Asc("z") Then mInByte(i) = mInByte(i) - Asc("a") + 26 ElseIf mInByte(i) >= Asc("0") And mInByte(i) <= Asc("9") Then mInByte(i) = mInByte(i) - Asc("0") + 52 ElseIf mInByte(i) = Asc("+") Then mInByte(i) = 62 ElseIf mInByte(i) = Asc("/") Then mInByte(i) = 63 Else '"=" ByteNum = ByteNum + 1 mInByte(i) = 0 End If Next i '取前六位 tByte = (mInByte(0) And &H3F) * 4 + (mInByte(1) And &H30) / 16