加解密函数在php,java和c#上的适配

一般加密解密使用通用的加解密算法, 但是各个语言的使用方法也不同, 有时候搞来搞去的, 发现php加出来的java又解不了, 最近看了下

其实一个加密api的使用主要有三个部分, 只要各个语言的三种模式都设置相同, 那么就能相互加解密成功, 这三个部分是:

  1. 算法
  2. 块模式
  3. 填充模式

三种语言的使用加解密库代码:

java

Cipher.getInstance() 函数直接设定并获得加密类

private static String decrypt(String value,String key) {
	    try{
    		SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(),"TripleDES");
    		Cipher cipher = Cipher.getInstance("TripleDES/ECB/NoPadding");   //  算法/块模式/填充模式
    		cipher.init(Cipher.DECRYPT_MODE, keySpec);
    		byte[] decryptedByte=cipher.doFinal(Base64.getDecoder().decode(value.getBytes()));
    		return new String(decryptedByte);
    	} catch (Exception e) {
    			e.printStackTrace();
    			return null;
    	}
}

c# 的

XXXXXXCryptoServiceProvider 类提供加密算法, 他的Mode属性设置模式,Padding属性设置填充模式

public static string DESDeCode(string pToDecrypt, string sKey)
{
	TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); //算法
	byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);

	tdes.Key = Encoding.UTF8.GetBytes(sKey);
	tdes.Mode = CipherMode.ECB;			//块模式
	tdes.Padding = PaddingMode.Zeros;		//填充模式
	ICryptoTransform cTransform = tdes.CreateDecryptor();
	byte[] resultArray = cTransform.TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);
	string str = Encoding.UTF8.GetString(resultArray);
	return str;
}

php

php最简单, 一个函数就搞定, 第一个参数设置算法, 第四个参数设置模式; php默认的填充模式是Zeros, 也就是填充0

<?php
	$text = mcrypt_decrypt(
		MCRYPT_TRIPLEDES,			//指定算法
		$KEY,$cryptStr,
		MCRYPT_MODE_ECB				//块模式
	);

对应关系示例

php java c#
MCRYPT_TRIPLEDES, MCRYPT_MODE_ECB “TripleDES/ECB/NoPadding” TripleDESCryptoServiceProvider, CipherMode.ECB, PaddingMode.Zeros
MCRYPT_TRIPLEDES, MCRYPT_MODE_CBC “TripleDES/CBC/NoPadding” TripleDESCryptoServiceProvider, CipherMode.CBC, PaddingMode.Zeros

CBC 和 ECB

加密实际上就是把要加密的明文按位数分块, 然后再把密码也分块, 把明文块和密码块输入到加密算法中计算得到密文块的过程; 而CBC ECB指定的是明文块和密码块的输入方式

ECB模式就是简单的对应, 明文块0对应密码块0, 输入到算法中得到密文块0, 用图说明:

CBC模式, 它还需要一个叫iv的变量, 明文块0先和iv计算, 然后对应密码块0 , 输入到算法中得到密文块0, 密文块1则是通过明文块1和上一步的结果, 也就是密文块0计算, 再和密码块1输入到算法中得到

java 可用[算法/块模式/填充模式]列表

php的算法列表

php的块模式列表

c#的块模式列表

c#的填充模式列表