Base 64 百度百科
MD5 百度百科
AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
AES 百度百科
AES加密 - iOS与Java的同步实现
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
明文 | 转换方式 | 密文 |
---|---|---|
你好! | Base64 | 5L2g5aW977yB |
转码过程例子:
3*8=4*6
内存1个字节占8位
转前: s 1 3
先转成ascii:对应 115 49 51
2进制: 01110011 00110001 00110011
6个一组(4组) 011100110011000100110011
然后才有后面的 011100 110011 000100 110011
然后计算机是8位8位的存数 6不够,自动就补两个高位0了
所有有了 高位补0
科学计算器输入 00011100 00110011 00000100 00110011
得到 28 51 4 51
查对下照表 c z E z
其实在 java 1.8 ,Base 64 已被置入 java util 包下,在这之后做 Base64 转换不再需要依赖外部 jar
import java.util.Base64;
/**
* 将目标 Base64 化
*
* @param targetString 目标参数
* @return 目标参数 Base64 编码后的值
*/
public static String encodeBase64(byte[] targetString) {
Base64.Encoder encoder_Default = Base64.getEncoder();
String result = encoder_Default.encodeToString(targetString);
return result;
}
/**
* 将目标反 Base64 化
*
* @param targetString 目标参数
* @return 目标参数反 Base64 编码后的值
*/
public static String decodeBase64(String targetString) {
Base64.Decoder decoder_Default = Base64.getDecoder();
String result = null;
try {
byte[] result_temp = decoder_Default.decode(targetString.getBytes("utf-8"));
result = new String(result_temp);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
与 MD5、AES不同,Base 64 严格来说不属于加密,而是一种编码形式。在介绍加密之前首先得了解一些基本概念。另:从加密开始原理就已经不是简单几句能讲明白的了,故下文不再说明,本文顶部有传送门,自行酌情深入研究。
传送门:对称加密和非对称加密介绍和区别
非对称加密
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。引用块内容
明文 | 转换方式 | 密文 |
---|---|---|
哈喽~ | MD5 & Hex | 61C5910F49B8FE5A4F9D59F9E80E89BF |
private static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
public static byte[] sign_MD5(String targetString) {
byte[] result = null;
try {
MessageDigest generator_MD5 = MessageDigest.getInstance("MD5");
generator_MD5.update(targetString.getBytes("utf-8"));
result = generator_MD5.digest();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return result;
}
private static String byteToHexString(byte[] target) {
String result = null;
int dataLength = target.length;
char resultTemp[] = new char[dataLength * 2];
try {
int k = 0;
for (int i = 0; i < dataLength; i++) {
byte byte0 = target[i];
resultTemp[k++] = hexDigits[byte0 >>> 4 & 0xf];
resultTemp[k++] = hexDigits[byte0 & 0xf];
}
} catch (Exception e) {
e.printStackTrace();
}
result = new String(resultTemp);
return result;
}
对称加密
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
明文 | 转换方式 | 密文 |
---|---|---|
AAA | 密钥 1111 填充方式 PKCS5Padding 加密模式 ECB | L9ktI5YPac6YmNvXbab68A== |
public static String encryptAES(String content, String key)
throws InvalidKeyException, NoSuchAlgorithmException,
NoSuchPaddingException, UnsupportedEncodingException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] byteContent = content.getBytes("UTF-8");
// 注意,为了能与 iOS 统一
// 这里的 key 不可以使用 KeyGenerator、SecureRandom、SecretKey 生成
byte[] enCodeFormat = key.getBytes();
SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
byte[] initParam = IV_STRING.getBytes();
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
// 指定加密的算法、工作模式和填充方式
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] encryptedBytes = cipher.doFinal(byteContent);
// 同样对加密后数据进行 base64 编码
Encoder encoder = Base64.getEncoder();
return encoder.encodeToString(encryptedBytes);
}