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)
Annonceindlæg fra Deloitte
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.
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(); } }
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"); } } }
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(); } } }
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"); } } } }
14. marts 2009 - 21:21
#6
Simpelthen suverænt, tak. Point?
14. marts 2009 - 22:33
#7
yes
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.
Kurser inden for grundlæggende programmering