Avatar billede erve Nybegynder
13. marts 2009 - 10:07 Der er 7 kommentarer og
1 løsning

Fælles kryptering for .NET og java

Er der nogen der har eksempler på kryptering, der virker i både .NET og java, altså så en .NET applikation kan decryptere noget der er krypteret af java og viseversa. Vi har forsøgt med rijndael, men det er lissom ikke samme algoritme der anvendes, og nettet er fuld af artikler hvor folk ikke kan få det til at virke.
Allerhelst færdig eksempler, men alle hints er velkomne.
Undtagen simple monoalfabetiske symmetriske algoritmer - dem kan vi godt selv lave :o)
Avatar billede arne_v Ekspert
14. marts 2009 - 02:18 #1
AES er helt fint.

Man skal bare vælge præcis samme variant af AES i Java og .NET !

Eksempel følger.
Avatar billede arne_v Ekspert
14. marts 2009 - 02:18 #2
package march;

import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class WriteAES {
    public static void main(String[] args) throws Exception {
        String key = "Top hemmelig key";
        byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
        String data = "Top hemmelige data";
        Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");
        aes.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes("UTF-8"), "AES"), new IvParameterSpec(iv));
        byte[] cipher = aes.doFinal(data.getBytes("UTF-8"));
        OutputStream os = new FileOutputStream("C:\\aes.dat");
        os.write(cipher);
        os.close();
    }

}
Avatar billede arne_v Ekspert
14. marts 2009 - 02:18 #3
package march;

import java.io.FileInputStream;
import java.io.InputStream;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class ReadAES {
    public static void main(String[] args) throws Exception {
        byte[] cipher = new byte[10000];
        InputStream is = new FileInputStream("C:\\aes.dat");
        int cipherlen = is.read(cipher);
        is.close();
        String key = "Top hemmelig key";
        byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
        String data = "Top hemmelige data";
        Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");
        aes.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes("UTF-8"), "AES"), new IvParameterSpec(iv));
        String newdata = new String(aes.doFinal(cipher, 0, cipherlen), "UTF-8");
        if(!newdata.equals(data)) {
            System.out.println("Oops");
        }
    }
}
Avatar billede arne_v Ekspert
14. marts 2009 - 02:18 #4
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string key = "Top hemmelig key";
            byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
            string data = "Top hemmelige data";
            Rijndael aes = new RijndaelManaged();
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;
            ICryptoTransform encrypt = aes.CreateEncryptor(Encoding.UTF8.GetBytes(key), iv);
            byte[] cipher = encrypt.TransformFinalBlock(Encoding.UTF8.GetBytes(data), 0, Encoding.UTF8.GetByteCount(data));
            Stream stm = new FileStream(@"C:\aes.dat", FileMode.Create, FileAccess.Write);
            stm.Write(cipher, 0, cipher.Length);
            stm.Close();
        }
    }
}
Avatar billede arne_v Ekspert
14. marts 2009 - 02:19 #5
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            byte[] cipher = new byte[10000];
            Stream stm = new FileStream(@"C:\aes.dat", FileMode.Open, FileAccess.Read);
            int cipherlen = stm.Read(cipher, 0, cipher.Length);
            stm.Close();
            string key = "Top hemmelig key";
            byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
            string data = "Top hemmelige data";
            Rijndael aes = new RijndaelManaged();
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;
            ICryptoTransform decrypt = aes.CreateDecryptor(Encoding.UTF8.GetBytes(key), iv);
            string newdata = Encoding.UTF8.GetString(decrypt.TransformFinalBlock(cipher, 0, cipherlen));
            if(newdata != data)
            {
                Console.WriteLine("Oops");
            }
        }
    }
}
Avatar billede erve Nybegynder
14. marts 2009 - 21:21 #6
Simpelthen suverænt, tak. Point?
Avatar billede arne_v Ekspert
14. marts 2009 - 22:33 #7
yes
Avatar billede arne_v Ekspert
14. marts 2009 - 22:34 #8
Hvorfor det hedder PKCS5 i Java og PKCS7 i .NET må du ikke spørge om, men det virker.

For optimal sikkerhedfor CBC bør iv være random ikke fast. Men iv må gerne være kendt bare den ikke er det samme fra gang til gang.
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