Avatar billede macromedianoob Nybegynder
17. juni 2008 - 17:24 Der er 10 kommentarer og
1 løsning

Oversættelse af C# til Java

Hejsa!

200 points til den som kan oversætte nedenstående krypterings algoritme fra C# til Java.

public string Encrypt(string toEncrypt)//, string key, bool useHashing)
    {
        byte[] keyArray;
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

        keyArray = UTF8Encoding.UTF8.GetBytes("MySecretKey");

        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);
       
        //BASE64
        //return Convert.ToBase64String(resultArray, 0, resultArray.Length);

        //HEX
        byte[] keyAscii = Convert.FromBase64String(Convert.ToBase64String(resultArray, 0, resultArray.Length));
        string keyHex = ConvertByteArrayToHexString(keyAscii);

        return keyHex;
    }

    private string ConvertByteArrayToHexString(byte[] bytes)
    {
        string hex = "";
        foreach (byte b in bytes)
        {
            char c = (char)b;
            int tmp = c;
            hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
        }
        return hex;
    }

Mvh. MMN
Avatar billede arne_v Ekspert
17. juni 2008 - 18:00 #1
public class TrippleDESEncrypt {
    static {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
    }
    public static String encrypt(String s) throws NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
        Cipher crypt = Cipher.getInstance("DESede/ECB/PKCS7Padding");
        SecretKey key = new SecretKeySpec("MySecretKeyxxxxx".getBytes(), "DESede");
        crypt.init(Cipher.ENCRYPT_MODE, key);
        byte[] plain = s.getBytes("UTF-8");
        byte[] cipher = crypt.doFinal(plain, 0, plain.length);
        return toHex(cipher);

    }
  private static String toHex(byte[] ba) {
        char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                            'a', 'b', 'c', 'd', 'e', 'f' };
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < ba.length; i++) {
            sb.append(hexdigit[(ba[i] >> 4) & 0x0F]);
            sb.append(hexdigit[ba[i] & 0x0F]);
        }
        return sb.toString();
    }
}
Avatar billede arne_v Ekspert
17. juni 2008 - 18:03 #2
Jeg har paddet key'en til 16 bogstaver af indlysende aarsager.

Den kraver at du henter og bruger BouncyCastle provider fordi standard provider
ikke tilbyder PKCS7Padding (kun PKCS5Padding).
Avatar billede macromedianoob Nybegynder
17. juni 2008 - 19:26 #3
Hej Arne :-)

Det ser fint ud, men for at kunne teste det, hvilke namespaces skal jeg importerer?
Avatar billede arne_v Ekspert
17. juni 2008 - 19:51 #4
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
Avatar billede macromedianoob Nybegynder
17. juni 2008 - 20:25 #5
Takker. Den brokker sig dog stadig over en enkel ting:

org.bouncycastle cannot be resolved to a type ??
Avatar billede arne_v Ekspert
17. juni 2008 - 21:16 #6
Avatar billede arne_v Ekspert
17. juni 2008 - 21:20 #7
Du skal hente BouncyVastle provider og putte den i classpath !
Avatar billede macromedianoob Nybegynder
18. juni 2008 - 00:41 #8
Hej igen! Du er min helt - endnu en gang ;)

Kan du også vise mig hvordan Decrypt metoden ser ud, så er der 200 points på vej :-)
Avatar billede arne_v Ekspert
18. juni 2008 - 03:29 #9
public static String decrypt(String s) throws NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
        Cipher crypt = Cipher.getInstance("DESede/ECB/PKCS7Padding");
        SecretKey key = new SecretKeySpec("MySecretKeyxxxxx".getBytes(), "DESede");
        crypt.init(Cipher.DECRYPT_MODE, key);
        byte[] cipher = fromHex(s);
        byte[] plain = crypt.doFinal(cipher, 0, cipher.length);
        return new String(plain, "UTF-8");
    }
    private static byte[] fromHex(String s) {
        int n = s.length() / 2;
        byte[] res = new byte[n];
        for(int i = 0; i < n; i++) {
            res[i] = (byte)(hexval(s.charAt(2 * i)) * 16 + hexval(s.charAt(2 * i + 1)));
        }
        return res;
    }
    private static int hexval(char c) {
        if(c >= '0' && c <= '9') {
            return c - '0';
        } else if(c >= 'A' && c <= 'F') {
            return c - 'A' + 10;
        } else if(c >= 'a' && c <= 'f') {
            return c - 'a' + 10;
        } else {
            return 0;
        }
    }
Avatar billede arne_v Ekspert
18. juni 2008 - 03:29 #10
og et svar
Avatar billede macromedianoob Nybegynder
18. juni 2008 - 18:30 #11
Hej Arne - testede det tidligere...det hele spiller! Du skal have SUPER mange tak for din uovertruffen ekspertise ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester