加解密函数在php,java和c#上的适配
一般加密解密使用通用的加解密算法, 但是各个语言的使用方法也不同, 有时候搞来搞去的, 发现php加出来的java又解不了, 最近看了下
其实一个加密api的使用主要有三个部分, 只要各个语言的三种模式都设置相同, 那么就能相互加解密成功, 这三个部分是:
- 算法
- 块模式
- 填充模式
三种语言的使用加解密库代码:
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 可用[算法/块模式/填充模式]列表
- AES/CBC/NoPadding (128)
- AES/CBC/PKCS5Padding (128)
- AES/ECB/NoPadding (128)
- AES/ECB/PKCS5Padding (128)
- DES/CBC/NoPadding (56)
- DES/CBC/PKCS5Padding (56)
- DES/ECB/NoPadding (56)
- DES/ECB/PKCS5Padding (56)
- DESede/CBC/NoPadding (168)
- DESede/CBC/PKCS5Padding (168)
- DESede/ECB/NoPadding (168)
- DESede/ECB/PKCS5Padding (168)
- RSA/ECB/PKCS1Padding (1024, 2048)
- RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
- RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
php的算法列表
- define (‘MCRYPT_ENCRYPT’, 0);
- define (‘MCRYPT_DECRYPT’, 1);
- define (‘MCRYPT_DEV_RANDOM’, 0);
- define (‘MCRYPT_DEV_URANDOM’, 1);
- define (‘MCRYPT_RAND’, 2);
- define (‘MCRYPT_3DES’, “tripledes”);
- define (‘MCRYPT_ARCFOUR_IV’, “arcfour-iv”);
- define (‘MCRYPT_ARCFOUR’, “arcfour”);
- define (‘MCRYPT_BLOWFISH’, “blowfish”);
- define (‘MCRYPT_BLOWFISH_COMPAT’, “blowfish-compat”);
- define (‘MCRYPT_CAST_128’, “cast-128”);
- define (‘MCRYPT_CAST_256’, “cast-256”);
- define (‘MCRYPT_CRYPT’, “crypt”);
- define (‘MCRYPT_DES’, “des”);
- define (‘MCRYPT_ENIGNA’, “crypt”);
- define (‘MCRYPT_GOST’, “gost”);
- define (‘MCRYPT_LOKI97’, “loki97”);
- define (‘MCRYPT_PANAMA’, “panama”);
- define (‘MCRYPT_RC2’, “rc2”);
- define (‘MCRYPT_RIJNDAEL_128’, “rijndael-128”);
- define (‘MCRYPT_RIJNDAEL_192’, “rijndael-192”);
- define (‘MCRYPT_RIJNDAEL_256’, “rijndael-256”);
- define (‘MCRYPT_SAFER64’, “safer-sk64”);
- define (‘MCRYPT_SAFER128’, “safer-sk128”);
- define (‘MCRYPT_SAFERPLUS’, “saferplus”);
- define (‘MCRYPT_SERPENT’, “serpent”);
- define (‘MCRYPT_THREEWAY’, “threeway”);
- define (‘MCRYPT_TRIPLEDES’, “tripledes”);
- define (‘MCRYPT_TWOFISH’, “twofish”);
- define (‘MCRYPT_WAKE’, “wake”);
- define (‘MCRYPT_XTEA’, “xtea”);
- define (‘MCRYPT_IDEA’, “idea”);
- define (‘MCRYPT_MARS’, “mars”);
- define (‘MCRYPT_RC6’, “rc6”);
- define (‘MCRYPT_SKIPJACK’, “skipjack”);
php的块模式列表
- define (‘MCRYPT_MODE_CBC’, “cbc”);
- define (‘MCRYPT_MODE_CFB’, “cfb”);
- define (‘MCRYPT_MODE_ECB’, “ecb”);
- define (‘MCRYPT_MODE_NOFB’, “nofb”);
- define (‘MCRYPT_MODE_OFB’, “ofb”);
- define (‘MCRYPT_MODE_STREAM’, “stream”);
c#的块模式列表
- CBC
- CFB
- CTS
- ECB
- OFB
c#的填充模式列表
- ANSIX923
- ISO10126
- None
- PKCS7
- Zeros