Password encryption
I need to translate the following C# code to java code:
public static string Encrypt(string toEncrypt, string key, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
if (useHashing)
{
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
}
else
keyArray = UTF8Encoding.UTF8.GetBytes(key);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
public static string Decrypt(string toDecrypt, string key, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
if (useHashing)
{
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
}
else
keyArray = UTF8Encoding.UTF8.GetBytes(key);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
Any help?
# 1
Well, my setup doesn't include any providers that allow DESede/ECB/PKCS7Padding. If I switch to PKCS5, tho, tho following works for me:package javaforum;
import java.security.MessageDigest;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class CSharpEncrypt {
public byte[] cleanKeyBytes(byte[] proposed) {
if (proposed.length == 24)
return proposed;
byte[] required = new byte[24];
for (int i=0; i<required.length; i++) {
required[i] = proposed[i % proposed.length];
}
return required;
}
public SecretKey generateKey(String keyStr, boolean hashMe) throws Exception {
byte[] keyArray;
if (hashMe) {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(keyStr.getBytes("UTF8"));
keyArray = md.digest();
}
else
keyArray = keyStr.getBytes("UTF8");
keyArray = cleanKeyBytes(keyArray);
KeySpec spec = new DESedeKeySpec(keyArray);
SecretKey key = SecretKeyFactory.getInstance("DESede").generateSecret(spec);
return key;
}
public String encrypt(String toEncrypt, String keyStr, boolean useHashing)
throws Exception {
byte[] toEncryptArray = toEncrypt.getBytes("UTF8");
SecretKey key = generateKey(keyStr, useHashing);
Cipher c = Cipher.getInstance("DESede/ECB/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, key);
byte[] resultArray = c.doFinal(toEncryptArray);
return new BASE64Encoder().encode(resultArray);
}
public String decrypt(String toDecrypt, String keyStr, boolean useHashing)
throws Exception {
byte[] toDecryptArray = new BASE64Decoder().decodeBuffer(toDecrypt);
SecretKey key = generateKey(keyStr, useHashing);
Cipher c = Cipher.getInstance("DESede/ECB/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, key);
byte[] resultArray = c.doFinal(toDecryptArray);
return new String(resultArray, "UTF8");
}
public static void main(String[] args) {
try {
CSharpEncrypt engine = new CSharpEncrypt();
String encoded = engine.encrypt(args[0], args[1], true);
String decoded = engine.decrypt(encoded, args[1], true);
System.out.println("WITH HASHING: PLAIN: ["+args[0]+"] ENC: ["+encoded+"] DEC: ["+decoded+"]");
encoded = engine.encrypt(args[0], args[1], false);
decoded = engine.decrypt(encoded, args[1], false);
System.out.println("USE KEY: PLAIN: ["+args[0]+"] ENC: ["+encoded+"] DEC: ["+decoded+"]");
}
catch (Exception e) {
System.err.println("FATAL ERROR!");
e.printStackTrace();
}
}
}
arg0 is the plaintext, arg1 is the key-string.
Note: key generation is horribly weak - sorry about that. There are algorithms for doing a better job.
If anybody knows of a JCE provider that allows DESede/ECB/PKCS7, sing out...
Grant>