Usuário com melhor resposta
Transformar vb para c#

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 FunctionNão consigo transformar pra C#, help me ?
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
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
-
-
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
- Sugerido como Resposta William John Adam Trindade terça-feira, 14 de outubro de 2014 13:29
-
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
----------------------------------------------------------
- Sugerido como Resposta Demetrius Quadros terça-feira, 14 de outubro de 2014 15:27
-
-
-
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
-
nem posso usar esse código Mr. GMSOFT, pois já tenho uma base de dados utilizando de forma diferente.
-
-
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 -
-
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
----------------------------------------------------------
-
-
me mostra a rotina de critptografia...
Tem como fazer mas eu preciso fazer um teste.
att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
-
-
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
-
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
----------------------------------------------------------
-
é 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.
-
Mas essa DLL vc nao tem acesso ao codigo?
É um componente comprado?
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
-
-
vc tem acesso ao codigo dessa dll?
att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
-
-
-
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
-
-
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
----------------------------------------------------------