none
Transformar código Java em C# RRS feed

  • 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();
        }
    }

    segunda-feira, 13 de agosto de 2018 14:11

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




    • Marcado como Resposta Milzerk terça-feira, 14 de agosto de 2018 16:17
    • Editado Milzerk terça-feira, 14 de agosto de 2018 16:18 Escrita incorreta
    terça-feira, 14 de agosto de 2018 16:16

Todas as Respostas

  • Bom dia, Tudo bem?

    A classe "UUID" do Java é equivalente à "Guid" do C#

    Sobre a criptografia da String pode dar uma olhada neste link

    http://www.linhadecodigo.com.br/artigo/3148/metodo-sha-256.aspx

    segunda-feira, 13 de agosto de 2018 14:24
  • 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.
    segunda-feira, 13 de agosto de 2018 15:11
  • 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-dd6eb8791c96

    C#:

    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#??

    segunda-feira, 13 de agosto de 2018 16:53
  • 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 :'(

    segunda-feira, 13 de agosto de 2018 16:57
  • 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
    segunda-feira, 13 de agosto de 2018 17:20
  • 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.


    segunda-feira, 13 de agosto de 2018 19:28
  • Mas Milzerk...

        Não seria legal que a encriptação seja validada independente da mudança de código?...
        ... tipo: O código C# pode ser diferente, mas o resultado é o correto sempre.

    []'s,
    Fabio I.
    segunda-feira, 13 de agosto de 2018 20:04
  • 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.
    segunda-feira, 13 de agosto de 2018 20:29
  • 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
    segunda-feira, 13 de agosto de 2018 20:33
  • Fabio,

    Essa solução passou pela cabeça. mas não tenho ideia de como fazer isso. vou ter que pesquisar

    segunda-feira, 13 de agosto de 2018 20:34
  • Milzerk,

       Você tem alguma IDE "javanesa" na sua máquina?
       - Pode ser uma: netbeans, eclipse, sei lá...

       Sinto muito por eu não saber fazer, mas acredito que não seja mega dificil.

    []'s,
    Fabio I.
    segunda-feira, 13 de agosto de 2018 20:43
  • Fabio,

    Estou usando Netbeans no momento. 

    segunda-feira, 13 de agosto de 2018 20:45
  • Milzerk,

        Beleza! Manda bala!

    []'s,
    Fabio I.

    terça-feira, 14 de agosto de 2018 00:56
  • 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




    • Marcado como Resposta Milzerk terça-feira, 14 de agosto de 2018 16:17
    • Editado Milzerk terça-feira, 14 de agosto de 2018 16:18 Escrita incorreta
    terça-feira, 14 de agosto de 2018 16:16