none
Transformar vb para c# RRS feed

  • Pergunta

  • Function Decriptar(senha)
        Dim tam
        Dim letra
        Dim i
        Dim nova_senha

        letra = array()

        tam = Len(senha)
        redim letra(tam)
        For i = 1 To tam
            letra(i) = Mid(senha, i, 1)
            If Chr(Asc(letra(i)) - (i * tam + (tam - i) * 2)) = Chr(174) Then
                nova_senha = nova_senha + Chr(Asc(Chr(39) - (i * tam + (tam - i) * 2)))
            ElseIf Chr(Asc(letra(i)) - (i * tam + (tam - i) * 2)) = Chr(175) Then
                nova_senha = nova_senha + Chr(Asc(Chr(34) - (i * tam + (tam - i) * 2)))
            Else
                nova_senha = nova_senha + Chr(Asc(letra(i)) - (i * tam + (tam - i) * 2))
            End If
        Next
        Decriptar = nova_senha

    End Function

    Não consigo transformar pra C#, help me ?

        
    terça-feira, 14 de outubro de 2014 12:38

Respostas

  • ASCII para unicode sim... o problema é o contrario.... ASCII tem somente 256 caracteres.. Unicode tem 109 000...

    Todo ASCII tem um equivalente unicode, mas nem todo unicode tem um equivaliente ASCII

    O problema da sua DLL é que ela esta devolvendo UNICODE (por isso eu pedi para ver o codigo) e sua rotina de decriptagem esta esperando um ASCII.

    Ou voce acha o codigo do rotina de criptografia e faz ela retornar ascii ou muda a rotina de decriptografia para trabalhar com Unicode.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Marcado como Resposta Jeff Valentim quinta-feira, 16 de outubro de 2014 14:54
    • Não Marcado como Resposta Jeff Valentim quinta-feira, 16 de outubro de 2014 14:54
    • Marcado como Resposta Jeff Valentim quinta-feira, 16 de outubro de 2014 14:56
    quinta-feira, 16 de outubro de 2014 14:46

Todas as Respostas

  • Jeff.

    use este site para converter....

    http://www.developerfusion.com/tools/convert/vb-to-csharp/

    public object Decriptar(senha)
    {
    	dynamic tam = null;
    	dynamic letra = null;
    	dynamic i = null;
    	dynamic nova_senha = null;
    
    	letra = Array();
    
    	tam = Strings.Len(senha);
    	 // ERROR: Not supported in C#: ReDimStatement
    
    	for (i = 1; i <= tam; i++) {
    		letra(i) = Strings.Mid(senha, i, 1);
    		if (Strings.Chr(Strings.Asc(letra(i)) - (i * tam + (tam - i) * 2)) == Strings.Chr(174)) {
    			nova_senha = nova_senha + Strings.Chr(Strings.Asc(Strings.Chr(39) - (i * tam + (tam - i) * 2)));
    		} else if (Strings.Chr(Strings.Asc(letra(i)) - (i * tam + (tam - i) * 2)) == Strings.Chr(175)) {
    			nova_senha = nova_senha + Strings.Chr(Strings.Asc(Strings.Chr(34) - (i * tam + (tam - i) * 2)));
    		} else {
    			nova_senha = nova_senha + Strings.Chr(Strings.Asc(letra(i)) - (i * tam + (tam - i) * 2));
    		}
    	}
    	return nova_senha;
    
    }


    Natan


    • Editado 'Natan Silva terça-feira, 14 de outubro de 2014 12:46
    terça-feira, 14 de outubro de 2014 12:45
  • chr e asc ,continua com mesmo erro
    terça-feira, 14 de outubro de 2014 13:08
  • Para Chr basta converter para int.
    Exemplo:
    
    char letra = 'A';
    int codido = Convert.ToInt32(letra);
    
    e o equivalente ao Asc, veja nesse post:
    https://social.msdn.microsoft.com/Forums/vstudio/en-US/13fec271-9a97-4b71-ab28-4911ff3ecca0/equivalent-in-c-of-asc-chr-functions-of-vb?forum=csharpgeneral

    terça-feira, 14 de outubro de 2014 13:28
  • Faça assim:

       public string Decriptar(string senha)
            {
                char letra;
                int tam = senha.Length;
                string nova_senha = "";
                int code = 0;
    
                for (int i = 0; i < tam; i++)
                {
                    letra = senha[i];
                    code = (i * tam + (tam - i) * 2);
                    if (letra - code == 174)
                        nova_senha += Convert.ToChar(39 - code);
                    else if (letra - code == 175)
                        nova_senha += Convert.ToChar(34 - code);
                    else
                        nova_senha += Convert.ToChar(letra - code);
                }
                return nova_senha;
    
            }

    Fica mais simples e nao precisa trabalhar com arrays.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 14 de outubro de 2014 14:13
  • Bom dia.

    Passo a seguinte senha cript    (su‹}„“)

    tinha que retornar casado descript.

    não funciona William, mesmo assim obrigado.

    terça-feira, 14 de outubro de 2014 14:29
  • alguém ?
    terça-feira, 14 de outubro de 2014 15:49
  • Veja esse link de um exemplo 100% funciona de Criptografia e Descriptografia:
    http://fabiocabral.gabx.com.br/2013/03/criptografando-strings-em-uma-aplicacao.html


    Código:
    public static string Criptografar(string Message)
            {
                string senha = "123465";
                byte[] Results; System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
                MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
                byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha)); 
                TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 
                TDESAlgorithm.Key = TDESKey; TDESAlgorithm.Mode = CipherMode.ECB; 
                TDESAlgorithm.Padding = PaddingMode.PKCS7; 
                byte[] DataToEncrypt = UTF8.GetBytes(Message); 
                try 
                { 
                    ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor(); 
                    Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length); 
                }
                finally 
                { 
                    TDESAlgorithm.Clear(); HashProvider.Clear(); 
                }
                return Convert.ToBase64String(Results);
            }           
            
            public static string Descriptografar(string Message) 
            {
                string senha = "123465";
                byte[] Results; System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 
                MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
                byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha)); 
                TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 
                TDESAlgorithm.Key = TDESKey; TDESAlgorithm.Mode = CipherMode.ECB; 
                TDESAlgorithm.Padding = PaddingMode.PKCS7; 
                byte[] DataToDecrypt = Convert.FromBase64String(Message); 
                try 
                { 
                    ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor(); 
                    Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length); 
                } 
                finally 
                { 
                    TDESAlgorithm.Clear(); HashProvider.Clear(); 
                }
                return UTF8.GetString(Results); 
            }
            private void button1_Click(object sender, EventArgs e)
            {
                textBox2.Text = Criptografar(textBox1.Text);
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                textBox1.Text = Descriptografar(textBox2.Text);
            }

    • Editado Mr. GMSOFT terça-feira, 14 de outubro de 2014 16:12
    terça-feira, 14 de outubro de 2014 16:06
  • nem posso usar esse código Mr. GMSOFT, pois já tenho uma base de dados utilizando de forma diferente.
    terça-feira, 14 de outubro de 2014 18:30
  • O código que esta usando atualmente, posta ele como você fez.
    terça-feira, 14 de outubro de 2014 18:32
  • uso uma dll, só tenho que mudar de vb para c#.

    Function Decriptar(senha)
        Dim tam
        Dim letra
        Dim i
        Dim nova_senha

        letra = array()

        tam = Len(senha)
        redim letra(tam)
        For i = 1 To tam
            letra(i) = Mid(senha, i, 1)
            If Chr(Asc(letra(i)) - (i * tam + (tam - i) * 2)) = Chr(174) Then
                nova_senha = nova_senha + Chr(Asc(Chr(39) - (i * tam + (tam - i) * 2)))
            ElseIf Chr(Asc(letra(i)) - (i * tam + (tam - i) * 2)) = Chr(175) Then
                nova_senha = nova_senha + Chr(Asc(Chr(34) - (i * tam + (tam - i) * 2)))
            Else
                nova_senha = nova_senha + Chr(Asc(letra(i)) - (i * tam + (tam - i) * 2))
            End If
        Next
        Decriptar = nova_senha

    End Function

        
    terça-feira, 14 de outubro de 2014 18:35
  • com a DLL eu só uso isso

      Cripto cripto = new Cripto();

                string senha = cripto.Encriptar(txtSenha.Text);
                string senhaEncriptada = senha.Substring(1);

    terça-feira, 14 de outubro de 2014 18:42
  • Tem um detalhe que eu esqueci.. realmente na hora de converter eu mudei a base do array, porque em C# a base é zero e no seu antigo codigo aparentemente ele estava trabalhando com base 1

    Para corrigir faça assim:

      public string Decriptar(string senha)
            {
                char letra;
                int tam = senha.Length;
                string nova_senha = "";
                int code = 0;
    
                for (int i = 1; i <= tam; i++)
                {
                    letra = senha[i-1];//base é 0 no C#
                    code = (i * tam + (tam - i) * 2);
                    if (letra - code == 174)
                        nova_senha += Convert.ToChar(39 - code);
                    else if (letra - code == 175)
                        nova_senha += Convert.ToChar(34 - code);
                    else
                        nova_senha += Convert.ToChar(letra - code);
                }
                return nova_senha;
    
            }

    Apesar de eu nao ter conseguido obser a palavra "casado" eu obtive a palavra "ca‡a῾Ὸ"

    Isso ocorre porque sua String no VB era em ANSI e no C# é unicode... por exemplo, o caractere "‹" em ascii é 139 mas em unicode é 8249

    Att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 14 de outubro de 2014 18:55
  • Boa tarde William 

    É possível de alguma forma acertar isso ?

    ŠŽ‘t¦¬ esse é o cript

    Passou no código e ficou assim: ŊeśeῪ@ll

    tinha que ser telec@ll

    Tem como acertar isso ?

    terça-feira, 14 de outubro de 2014 19:08
  • me mostra a rotina de critptografia...

    Tem como fazer mas eu preciso fazer um teste.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 14 de outubro de 2014 19:29
  • William , oque eu posso fazer é te mandar a dll.


    terça-feira, 14 de outubro de 2014 19:52
  •  private void teste(string senha2)
                {
                    string unicodeString = senha2;

                    // Create two different encodings.
                    Encoding ascii = Encoding.ASCII;
                    Encoding unicode = Encoding.Unicode;

                    // Convert the string into a byte array.
                    byte[] unicodeBytes = unicode.GetBytes(unicodeString);

                    // Perform the conversion from one encoding to the other.
                    byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);

                    // Convert the new byte[] into a char[] and then into a string.
                    char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
                    ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
                    string asciiString = new string(asciiChars);

                    // Display the strings created before and after the conversion.
                    Console.WriteLine("Original string: {0}", unicodeString);
                    Console.WriteLine("Ascii converted string: {0}", asciiString);
                }

    unicodeString = ŊeśeῪ@ll

    asciiString =?e?e?@ll


            
    • Editado Jeff Valentim terça-feira, 14 de outubro de 2014 19:57
    terça-feira, 14 de outubro de 2014 19:56
  • Nao entendi.. voce nao tem acesso ao metodo Encriptar??

    voce postou anteriormente:

    Cripto cripto = new Cripto();
    string senha = cripto.Encriptar(txtSenha.Text);
    string senhaEncriptada = senha.Substring(1);
    

    Voce tem o codigo do Decriptar mas nao tem do Encriptar????

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 14 de outubro de 2014 20:06
  • é isso aí.

    O cripto é uma dll que só passo 

    Cripto cripto = new Cripto();
    string senha = cripto.Encriptar(txtSenha.Text);
    string senhaEncriptada = senha.Substring(1);

    e o descript é essa função em vb que vejo no servidor, quero passar pra c# pra colocar na tela.

    terça-feira, 14 de outubro de 2014 20:10
  • Mas essa DLL vc nao tem acesso ao codigo?

    É um componente comprado?

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 14 de outubro de 2014 20:19
  • Não é comprado, apenas uma ferramenta que a empresa usa e tenho que usar tbm.

    posso te mandar por email.

    terça-feira, 14 de outubro de 2014 20:21
  • vc tem acesso ao codigo dessa dll?

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 14 de outubro de 2014 20:29
  • não tenho.
    quarta-feira, 15 de outubro de 2014 13:02
  • William  é possível converter  ascii para unicode ?


    quinta-feira, 16 de outubro de 2014 14:07
  • ASCII para unicode sim... o problema é o contrario.... ASCII tem somente 256 caracteres.. Unicode tem 109 000...

    Todo ASCII tem um equivalente unicode, mas nem todo unicode tem um equivaliente ASCII

    O problema da sua DLL é que ela esta devolvendo UNICODE (por isso eu pedi para ver o codigo) e sua rotina de decriptagem esta esperando um ASCII.

    Ou voce acha o codigo do rotina de criptografia e faz ela retornar ascii ou muda a rotina de decriptografia para trabalhar com Unicode.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Marcado como Resposta Jeff Valentim quinta-feira, 16 de outubro de 2014 14:54
    • Não Marcado como Resposta Jeff Valentim quinta-feira, 16 de outubro de 2014 14:54
    • Marcado como Resposta Jeff Valentim quinta-feira, 16 de outubro de 2014 14:56
    quinta-feira, 16 de outubro de 2014 14:46
  • Obrigado William, vou procurar um código pronto em ASCII pra facilitar meu lado, vou mudar tudo e pronto.

    Muito obrigado.

    quinta-feira, 16 de outubro de 2014 14:56
  • Se vc for refazer a parte da criptografia, utilize o codigo sugerido "Mr. GMSOFT"

    O problema da sua rotina de criptografia é que ela é fraca. Qualque hacker de meia pataca descobre ela rapido, porque ela é baseada em na "Chave de Cesar",ou seja, simplesmente muda um caracter por outro, exemplo IBM=HAL, note que cada letra é deslocada de 1 (no seu caso ela desloca usando a formula (i * tam + (tam - i) * 2))

    O metdo nativo é muito mais forte.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 16 de outubro de 2014 15:40