JAVA的Cipher.DECRYPT_MODE
和.NET的3desProvider.Mode = CipherMode.ECB
是对应的。
import
javax.crypto.Cipher;
import
javax.crypto.spec.SecretKeySpec;
![None.gif](/Images/OutliningIndicators/None.gif)
import
org.apache.commons.codec.binary.Base64;
![None.gif](/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public
class
CryptUtil3DES
{
private static final String CRYPT_KEY = "v3VC7LfCq6IL5KgIglqZrQ1b";
private static final String CRYPT_ALGORITHM = "DESede";
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static String decrypt(String value)
{
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
SecretKeySpec keySpec = new SecretKeySpec(CRYPT_KEY.getBytes(), CRYPT_ALGORITHM);
Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decodedByte = Base64.decodeBase64(value.getBytes());
byte[] decryptedByte = cipher.doFinal(decodedByte);
return new String(decryptedByte);
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch(Exception e)
{
return null;
}
}
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static String encrypt(String value)
{
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
SecretKeySpec keySpec = new SecretKeySpec(CRYPT_KEY.getBytes(), CRYPT_ALGORITHM);
Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedByte = cipher.doFinal(value.getBytes());
byte[] encodedByte = Base64.encodeBase64(encryptedByte);
return new String(encodedByte);
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch(Exception e)
{
return null;
}
}
}
![None.gif](/Images/OutliningIndicators/None.gif)
2。C#
public
class
CryptionData
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
// The length of Encryptionstring should be 24 byte and not be a weak key
private string EncryptionString;
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// The length of initialization vector should be 8 byte
private static Byte[] EncryptionIV = Encoding.Default.GetBytes(" ");
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
/// <summary>
/// Constructor
/// </summary>
public CryptionData()
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
/// <summary>
/// Constructor
/// </summary>
/// <param name="EncryptionString">SecureKey</param>
public CryptionData(string EncryptionString)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.EncryptionString = EncryptionString;
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
/// <summary>
/// Encryption method for byte array
/// </summary>
/// <param name="SourceData">source data</param>
/// <returns>byte array</returns>
public byte[] EncryptionByteData(byte[] SourceData)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
byte[] returnData = null;
try
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// Create TripleDESCryptoServiceProvider object
TripleDESCryptoServiceProvider desProvider = new TripleDESCryptoServiceProvider();
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Set SecureKey and IV of desProvider
byte[] byteKey = Encoding.Default.GetBytes(EncryptionString);
desProvider.Key = byteKey;
desProvider.IV = EncryptionIV;
desProvider.Mode = CipherMode.ECB;
// A MemoryStream object
MemoryStream ms = new MemoryStream();
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Create Encryptor
ICryptoTransform encrypto = desProvider.CreateEncryptor();
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Create CryptoStream object
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Encrypt SourceData
cs.Write(SourceData, 0, SourceData.Length);
cs.FlushFinalBlock();
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Get Encryption result
returnData = ms.ToArray();
}
catch (Exception ex)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw ex;
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
return returnData;
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
/// <summary>
/// Decryption method for byte array
/// </summary>
/// <param name="SourceData">source data</param>
/// <returns>byte array</returns>
public byte[] DecryptionByteData(byte[] SourceData)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
byte[] returnData = null;
try
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// Create TripleDESCryptoServiceProvider object
TripleDESCryptoServiceProvider desProvider = new TripleDESCryptoServiceProvider();
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Set SecureKey and IV of desProvider
byte[] byteKey = Encoding.Default.GetBytes(EncryptionString);
desProvider.Key = byteKey;
desProvider.IV = EncryptionIV;
desProvider.Mode = CipherMode.ECB;
// A MemoryStream object
MemoryStream ms = new MemoryStream();
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Create Decryptor
ICryptoTransform encrypto = desProvider.CreateDecryptor();
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Create CryptoStream object
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Decrypt SourceData
cs.Write(SourceData, 0, SourceData.Length);
cs.FlushFinalBlock();
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Get Decryption result
returnData = ms.ToArray();
}
catch (Exception ex)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw ex;
}
return returnData;
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
/// <summary>
/// Encryption method for string
/// </summary>
/// <param name="SourceData">source data</param>
/// <returns>string</returns>
public string EncryptionStringData(string SourceData)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
try
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// Convert source data from string to byte array
byte[] SourData = Encoding.Default.GetBytes(SourceData);
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Encrypt byte array
byte[] retData = EncryptionByteData(SourData);
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Convert encryption result from byte array to Base64String
return Convert.ToBase64String(retData, 0, retData.Length);
}
catch (Exception ex)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw ex;
}
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
/// <summary>
/// Decryption method for string
/// </summary>
/// <param name="SourceData">source data</param>
/// <returns>string</returns>
public string DecryptionStringdata(string SourceData)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
try
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// Convert source data from Base64String to byte array
byte[] SourData = Convert.FromBase64String(SourceData);
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Decrypt byte array
byte[] retData = DecryptionByteData(SourData);
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
// Convert Decryption result from byte array to string
return Encoding.Default.GetString(retData, 0, retData.Length);
}
catch (Exception ex)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw ex;
}
}
}
msdn 的例子中没有这句话。desProvider.Mode = CipherMode.ECB;
如果没有的话,java的那段程序的加密结果。在下面的c#中不能正确解密。 反之亦然。
以上是实际的调查结果。 具体3des的规范不是很了解。