Usuário com melhor resposta
Transformar código Java em C#

Pergunta
-
Olá. tenho um código java que cria um UUID e utiliza uma criptografia sha-256 por cima. Meu objetivo é transformar esse código Java em código c#. porém não sei quais funções utilizar. Help-me
Código Java:
public class JavaApplication1 { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here JavaApplication1 ja = new JavaApplication1(); String uuid = ja.getuuid(); System.out.println("Gerando UUID: " + uuid); String sha = ja.uuidSha2Encrypt(uuid); System.out.println("Gerando criptografia UUID: " + sha); } public static String uuidSha2Encrypt(String uuid) { try { MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update(uuid.getBytes()); return UUID.nameUUIDFromBytes(md.digest()).toString(); } catch (Exception var3) { throw new RuntimeException("Algoritmo SHA-256 não disponível", var3); } } public String getuuid(){ return UUID.randomUUID().toString(); } }
Respostas
-
Fabio,
Fiz algumas pesquisas, mas não achei nada útil sobre utilizar classes Java no projeto C#, apenas o contrário, onde utiliza a .dll em um sistema Java...
PORÉM, consegui achar a solução pra minha questão e para ajudar aqueles que tenham os mesmos problemas compartilharei o meu código aqui:
using System; using System.Security.Cryptography; using System.Text; namespace ConsoleApp1 { class Program { static void Main(string[] args) { while (Console.ReadKey().Key != ConsoleKey.Escape) { string value = criarGUID(); Console.WriteLine("Valor GUID sem cript: " + value); Console.WriteLine("Valor GUID com cript: " + SHA256(value)); Console.WriteLine(); } } // Criando um novo código GUID private static string criarGUID() { return Guid.NewGuid().ToString(); } //obtendo hash SHA256 da GUID private static string SHA256(string valor) { byte[] encod = Encoding.UTF8.GetBytes(valor); byte[] hash256 = new SHA256Managed().ComputeHash(encod); return NameUUIDFromBytes(hash256); } //Aplicando hash MD5 em cima do hash SHA256 e convertendo resultado para o formato GUID private static string NameUUIDFromBytes(byte[] input) { MD5 md5 = MD5.Create(); byte[] hash = md5.ComputeHash(input); hash[6] &= 0x0f; hash[6] |= 0x30; hash[8] &= 0x3f; hash[8] |= 0x80; string hex = BitConverter.ToString(hash).Replace("-", string.Empty).ToLower(); return hex.Insert(8, "-").Insert(13, "-").Insert(18, "-").Insert(23, "-"); } } }
Agradeço ao pessoal pela a ajuda e pelo conhecimento compartilhado :)
by: Milzerk
Todas as Respostas
-
-
Milzerk,
Não sei se é o caso, mas tem uns conversores automáticos na teia...
... Veja:
==============================================
Code Translation for .NET (C#<->VB.NET<->TypeScript<->Java)
https://www.carlosag.net/tools/codetranslator/
==============================================
Java to C# Converter
https://www.tangiblesoftwaresolutions.com/product_details/java_to_csharp_converter.html
https://www.tangiblesoftwaresolutions.com/product_details/csharp_to_java_converter_details.html
==============================================
[]'s,
Fabio I. -
Bom dia.. Estaria bem se não fosse esse probleminha ^^
eu consegui criar o código Guid no c#, porém a criptografia não foi como eu esperava, esses são o resultado java e c#:
JAVA:
Gerando UUID: b32df44a-ac81-4467-9f3d-495b1ed03822
Gerando criptografia UUID: 6ca9685c-f1a4-3d8f-b5a2-dd6eb8791c96C#:
Valor GUID sem cript: 6d9dd578-1bfd-4cae-af9f-d9672ac1013f
Valor GUID com cript: 91b437d640d7ce324666a0751374eabbaf4de4a88bd751da64e2f57ec92d384b
e esse foi meu código c#:
using System; using System.Security.Cryptography; using System.Text; namespace ConsoleApp1 { class Program { static void Main(string[] args) { ConsoleKey k = ConsoleKey.M; while (k != ConsoleKey.Escape) { k = Console.ReadKey().Key; if (k == ConsoleKey.Enter) { string value = criarGUID(); Console.WriteLine("Valor GUID sem cript: " + value); Console.WriteLine("Valor GUID com cript: " + SHA256(value)); } } } private static string criarGUID() { return Guid.NewGuid().ToString(); } private static string SHA256(string valor) { UnicodeEncoding UE = new UnicodeEncoding(); byte[] HashValue, MessageBytes = UE.GetBytes(valor); SHA256Managed SHhash = new SHA256Managed(); string strHex = ""; HashValue = SHhash.ComputeHash(MessageBytes); foreach (byte b in HashValue) { strHex += String.Format("{0:x2}", b); } return strHex; } } }
observei que no código java. ele traz de volta a string criptografada de volta para UUID
UUID.nameUUIDFromBytes(md.digest()).toString();
como poderia fazer isso em c#??
-
Olá Fabio ^^,
o conversor indicado foi uma ótima descoberta, porém ele não atendeu meu caso. o conversor não conseguiu converter pra mim o método chave que é o uuidSha2Encrypt, observe:
using System; /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ namespace javaapplication1 { /// /// <summary> /// @author Miller /// </summary> public class JavaApplication1 { /// <param name="args"> the command line arguments </param> public static void Main(string[] args) { // TODO code application logic here JavaApplication1 ja = new JavaApplication1(); string uuid = ja.getuuid(); Console.WriteLine("Gerando UUID: " + uuid); string sha = javaapplication1.JavaApplication1.uuidSha2Encrypt(uuid); Console.WriteLine("Gerando criptografia UUID: " + sha); } public static string uuidSha2Encrypt(string uuid) { try { MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update(uuid.GetBytes()); return System.Guid.nameUUIDFromBytes(md.digest()).ToString(); } catch (Exception var3) { throw new Exception("Algoritmo SHA-256 não disponível", var3); } } public virtual string getuuid() { return System.Guid.randomUUID().ToString(); } } }
o método getuuid também veio com erro, porém ja descobri como arruma-la. só falta a parte de criptografia :'(
-
Milzerk,
Talvez o "uuidSha2Encrypt" / "MessageDigest" seja muito específico do Java...
... mas achei alguma coisa que talvez possa te ajudar:
===================================================
Java MessageDigest class in C#
https://stackoverflow.com/questions/15470738/java-messagedigest-class-in-c-sharp
===================================================
MessageDigest code equivalent to C#
https://social.msdn.microsoft.com/Forums/expression/en-US/2e44c1e0-951b-4295-9510-afb4027f843e/messagedigest-code-equivalent-to-c?forum=csharpgeneral
===================================================
How to convert MessageDigest in C#*** JAVA:
final MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.reset(); digest.update(secretKey.getBytes("UTF-8")); final String key = new String(Hex.encodeHex(digest.digest())).substring(0, 32);
** C# (incomplete):
var sha = new SHA1CryptoServiceProvider(); string b64 = ByteArrayToString(Encoding.UTF8.GetBytes(secretKey)); var b64Bytes = Encoding.UTF8.GetBytes(b64);
I think below two lines should be added in my C# code.
var result = sha.ComputeHash(b64Bytes); var finalResult = BitConverter.ToString(result).Replace("-", "").ToLower();
https://www.codeproject.com/Questions/890318/How-to-convert-MessageDigest-in-Csharp
===================================================
Classe SHA256
https://msdn.microsoft.com/pt-br/library/system.security.cryptography.sha256%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
===================================================
Encryption Examples for C#
https://www.example-code.com/csharp/encryption.asp
===================================================
This post contains examples of how to generate a SHA-256 and SHA-512 hash key with the examples in C# and VB.NET
https://codeshare.co.uk/blog/sha-256-and-sha-512-hash-examples/
===================================================
[]'s,
Fabio I.
- Editado Fabio I segunda-feira, 13 de agosto de 2018 17:23
-
Olá Fabio.
Eu tentei fazer desta forma. porém não deu muito certo... Não precisa ser exatamente o mesmo código. quero apenas o mesmo hash. o MessageDigest.Digest() do java. traz uma sequencia de hashs diferentes do SHA256Managed.ComputeHash(). consegui resolver todos os demais pontos do código. porém pro meu sistema ficar OK preciso que as sequencia de hash sejam exatamente iguais. e estou emperrado nisso.
-
-
Fabio..
Acontece que o sistema já existente (o escrito em java) compara os dados criptografados nele com os dados salvo em banco. se eu salvar um dado criptografado em c# vai dar incompatibilidade na hora do sistema java comparar.- Editado Milzerk segunda-feira, 13 de agosto de 2018 20:30 Palavra incorreta.
-
Milzerk,
Tive uma idéia, mas não sei se te ajuda...
E se você criar uma "Biblioteca" estilo DLL no JAVA (compilando) e mandar referenciar essa biblioteca no C#?
Dessa forma você usaria exatamente como está escrito no JAVA dentro do C#.
Tipo: Só esse trecho mais complicado do código que funcionaria como uma "Caixa Preta", uma bilioteca referenciada no C#...
... sacou?
[]'s,
Fabio I.- Editado Fabio I segunda-feira, 13 de agosto de 2018 20:33
-
-
-
-
-
Fabio,
Fiz algumas pesquisas, mas não achei nada útil sobre utilizar classes Java no projeto C#, apenas o contrário, onde utiliza a .dll em um sistema Java...
PORÉM, consegui achar a solução pra minha questão e para ajudar aqueles que tenham os mesmos problemas compartilharei o meu código aqui:
using System; using System.Security.Cryptography; using System.Text; namespace ConsoleApp1 { class Program { static void Main(string[] args) { while (Console.ReadKey().Key != ConsoleKey.Escape) { string value = criarGUID(); Console.WriteLine("Valor GUID sem cript: " + value); Console.WriteLine("Valor GUID com cript: " + SHA256(value)); Console.WriteLine(); } } // Criando um novo código GUID private static string criarGUID() { return Guid.NewGuid().ToString(); } //obtendo hash SHA256 da GUID private static string SHA256(string valor) { byte[] encod = Encoding.UTF8.GetBytes(valor); byte[] hash256 = new SHA256Managed().ComputeHash(encod); return NameUUIDFromBytes(hash256); } //Aplicando hash MD5 em cima do hash SHA256 e convertendo resultado para o formato GUID private static string NameUUIDFromBytes(byte[] input) { MD5 md5 = MD5.Create(); byte[] hash = md5.ComputeHash(input); hash[6] &= 0x0f; hash[6] |= 0x30; hash[8] &= 0x3f; hash[8] |= 0x80; string hex = BitConverter.ToString(hash).Replace("-", string.Empty).ToLower(); return hex.Insert(8, "-").Insert(13, "-").Insert(18, "-").Insert(23, "-"); } } }
Agradeço ao pessoal pela a ajuda e pelo conhecimento compartilhado :)
by: Milzerk