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?

[1758 byte] By [nizarhandala] at [2007-11-27 4:59:04]
# 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>

ggaineya at 2007-7-12 10:15:15 > top of Java-index,Security,Cryptography...
# 2

> If anybody knows of a JCE provider that allows

> DESede/ECB/PKCS7, sing out...

>

It is my understanding that PKCS7 and PKCS5 Padding are the same for block sizes of between 1 and 255. This means that for everything I have ever worked on they are the same.

See ftp://ftp.rsa.com/pub/pkcs/ascii/pkcs-5.asc and ftp://ftp.rsa.com/pub/pkcs/ascii/pkcs-7.asc

Message was edited by:

sabre150

sabre150a at 2007-7-12 10:15:15 > top of Java-index,Security,Cryptography...