Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: Ozcarj en Diciembre 05, 2011, 12:29:18 am
-
Saludos a todo el foro, primeramente agradecimientos anticipados a todos los que les interese el tema, les comento que estuve buscando el codigo del algoritmo Alleged RC4 y Base 64 realizado en vb6, pero sin resultados, solo encontre uno realizado en C# y bueno yo soy un novato en programación y me preguntaba se alguno de ustedes compañeros pudiese ayudarme convirtiendo o migrando los siguientes codigos hechos en C# a VB6.
ALLEGEDRC4:
public string allegedrc4(string codigo, string llavellegada)
{
int[] State = new int[256 + 1];
string Mensaje = String.Empty;
string llave = String.Empty;
string MsgCif = String.Empty;
int X = 0;
int Y = 0;
int Index1 = 0;
int Index2 = 0;
int NMen = 0;
int i = 0;
short op1 = 0;
int aux = 0;
int op2 = 0;
string nrohex = String.Empty;
X = 0;
Y = 0;
Index1 = 0;
Index2 = 0;
Mensaje = codigo;
llave = llavellegada;
for (i = 0; i <= 255.0; i += 1)
{
State[i] = i;
}
for (i = 0; i <= 255.0; i += 1)
{
op1 = (short)(llave.Substring(Index1 + 1 - 1, 1)[0]);
Index2 = (op1 + State[i] + Index2) % 256;
aux = State[i];
State[i] = State[Index2];
State[Index2] = aux;
Index1 = (Index1 + 1) % llave.Length;
}
for (i = 0; i <= Mensaje.Length - 1; i += 1)
{
X = (X + 1) % 256;
Y = (State[X] + Y) % 256;
aux = State[X];
State[X] = State[Y];
State[Y] = aux;
op1 = (short)(Mensaje.Substring(i + 1 - 1, 1)[0]);
op2 = State[(State[X] + State[Y]) % 256];
NMen = op1 ^ op2;
nrohex = NMen.ToString("X");
if (nrohex.Length == 1)
{
nrohex = "0" + nrohex;
}
MsgCif = MsgCif + nrohex;
}
MsgCif = MsgCif.Substring(MsgCif.Length - (MsgCif.Length));
return MsgCif;
}
BASE 64:
string[] diccionario = new string[64] {
"0", "1", "2", "3", "4", "5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K" ,"L","M","N","O","P","Q","R","S","T","U","V" ,"W","X","Y","Z","a","b","c","d","e","f","g" ,"h","i","j","k","l","m","n","o","p","q","r" ,"s","t","u","v","w","x","y","z","+","/"
};
public string base64(int numero)
{
int cociente = 1; int resto; string palabra = "";
while (cociente > 0)
{
cociente = numero / 64;
resto = numero % 64;
palabra = diccionario[resto] + palabra;
numero = cociente;
}
return (palabra);
}
Otras vez muchas gracias por sus respuestas y/o comentarios.
Oscar J. Crespo
La Paz Bolivia
-
emm esto es C/C++ :P
y aqui es VB :P
-
@RHL no esta pidiendo scr en C# si no que lo ayuden a convertir un scr de C# a VB6.
encontre una clase que tenia guardada:
Option Explicit
Private Const Equals As Byte = 61 'Asc("=")
Private Const Mask1 As Byte = 3 '00000011
Private Const Mask2 As Byte = 15 '00001111
Private Const Mask3 As Byte = 63 '00111111
Private Const Mask4 As Byte = 192 '11000000
Private Const Mask5 As Byte = 240 '11110000
Private Const Mask6 As Byte = 252 '11111100
Private Const Shift2 As Byte = 4
Private Const Shift4 As Byte = 16
Private Const Shift6 As Byte = 64
Private Base64Lookup() As Byte
Private Base64Reverse() As Byte
Public Function EncodeString(Text As String) As String
Dim Data() As Byte
Data = StrConv(Text, vbFromUnicode)
EncodeString = EncodeByteArray(Data)
End Function
Public Function EncodeByteArray(Data() As Byte) As String
Dim EncodedData() As Byte
Dim DataLength As Long
Dim EncodedLength As Long
Dim Data0 As Long
Dim Data1 As Long
Dim Data2 As Long
Dim l As Long
Dim m As Long
Dim Index As Long
Dim CharCount As Long
DataLength = UBound(Data) + 1
EncodedLength = (DataLength \ 3) * 4
If DataLength Mod 3 > 0 Then EncodedLength = EncodedLength + 4
EncodedLength = EncodedLength + ((EncodedLength \ 76) * 2)
If EncodedLength Mod 78 = 0 Then EncodedLength = EncodedLength - 2
ReDim EncodedData(EncodedLength - 1)
m = (DataLength) Mod 3
For l = 0 To UBound(Data) - m Step 3
Data0 = Data(l)
Data1 = Data(l + 1)
Data2 = Data(l + 2)
EncodedData(Index) = Base64Lookup(Data0 \ Shift2)
EncodedData(Index + 1) = Base64Lookup(((Data0 And Mask1) * Shift4) Or (Data1 \ Shift4))
EncodedData(Index + 2) = Base64Lookup(((Data1 And Mask2) * Shift2) Or (Data2 \ Shift6))
EncodedData(Index + 3) = Base64Lookup(Data2 And Mask3)
Index = Index + 4
CharCount = CharCount + 4
If CharCount = 76 And Index < EncodedLength Then
EncodedData(Index) = 13
EncodedData(Index + 1) = 10
CharCount = 0
Index = Index + 2
End If
Next
If m = 1 Then
Data0 = Data(l)
EncodedData(Index) = Base64Lookup((Data0 \ Shift2))
EncodedData(Index + 1) = Base64Lookup((Data0 And Mask1) * Shift4)
EncodedData(Index + 2) = Equals
EncodedData(Index + 3) = Equals
Index = Index + 4
ElseIf m = 2 Then
Data0 = Data(l)
Data1 = Data(l + 1)
EncodedData(Index) = Base64Lookup((Data0 \ Shift2))
EncodedData(Index + 1) = Base64Lookup(((Data0 And Mask1) * Shift4) Or (Data1 \ Shift4))
EncodedData(Index + 2) = Base64Lookup((Data1 And Mask2) * Shift2)
EncodedData(Index + 3) = Equals
Index = Index + 4
End If
EncodeByteArray = StrConv(EncodedData, vbUnicode)
End Function
Public Function DecodeToString(EncodedText As String) As String
Dim Data() As Byte
Data = DecodeToByteArray(EncodedText)
DecodeToString = StrConv(Data, vbUnicode)
End Function
Public Function DecodeToByteArray(EncodedText As String) As Byte()
Dim Data() As Byte
Dim EncodedData() As Byte
Dim DataLength As Long
Dim EncodedLength As Long
Dim EncodedData0 As Long
Dim EncodedData1 As Long
Dim EncodedData2 As Long
Dim EncodedData3 As Long
Dim l As Long
Dim m As Long
Dim Index As Long
Dim CharCount As Long
EncodedData = StrConv(Replace$(Replace$(EncodedText, vbCrLf, ""), "=", ""), vbFromUnicode)
EncodedLength = UBound(EncodedData) + 1
DataLength = (EncodedLength \ 4) * 3
m = EncodedLength Mod 4
If m = 2 Then
DataLength = DataLength + 1
ElseIf m = 3 Then
DataLength = DataLength + 2
End If
ReDim Data(DataLength - 1)
For l = 0 To UBound(EncodedData) - m Step 4
EncodedData0 = Base64Reverse(EncodedData(l))
EncodedData1 = Base64Reverse(EncodedData(l + 1))
EncodedData2 = Base64Reverse(EncodedData(l + 2))
EncodedData3 = Base64Reverse(EncodedData(l + 3))
Data(Index) = (EncodedData0 * Shift2) Or (EncodedData1 \ Shift4)
Data(Index + 1) = ((EncodedData1 And Mask2) * Shift4) Or (EncodedData2 \ Shift2)
Data(Index + 2) = ((EncodedData2 And Mask1) * Shift6) Or EncodedData3
Index = Index + 3
Next
Select Case ((UBound(EncodedData) + 1) Mod 4)
Case 2
EncodedData0 = Base64Reverse(EncodedData(l))
EncodedData1 = Base64Reverse(EncodedData(l + 1))
Data(Index) = (EncodedData0 * Shift2) Or (EncodedData1 \ Shift4)
Case 3
EncodedData0 = Base64Reverse(EncodedData(l))
EncodedData1 = Base64Reverse(EncodedData(l + 1))
EncodedData2 = Base64Reverse(EncodedData(l + 2))
Data(Index) = (EncodedData0 * Shift2) Or (EncodedData1 \ Shift4)
Data(Index + 1) = ((EncodedData1 And Mask2) * Shift4) Or (EncodedData2 \ Shift2)
End Select
DecodeToByteArray = Data
End Function
Private Sub Class_Initialize()
Dim l As Long
ReDim Base64Reverse(255)
Base64Lookup = StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", vbFromUnicode)
For l = 0 To 63
Base64Reverse(Base64Lookup(l)) = l
Next
End Sub
lo otro te lo devo....
-
Encontre estos tal ves te sirva:
Base64
http://www.nonhostile.com/howto-encode-decode-base64-vb6.asp (http://www.nonhostile.com/howto-encode-decode-base64-vb6.asp)
http://www.source-code.biz/snippets/vbasic/12.htm (http://www.source-code.biz/snippets/vbasic/12.htm)
http://www.mcmillan.org.nz/paradoxes2/code/base64.html (http://www.mcmillan.org.nz/paradoxes2/code/base64.html)
Alleged RC4
Public Function alleged_RC4(keyASCII As String, menASCII As String) As String
Dim i As Integer
Dim x As Integer
Dim y As Integer
Dim index2 As Integer
Dim index1 As Integer
Dim tmp As Integer
Dim xorIndex As Integer
Dim men_len As Integer
Dim key_len As Integer
Dim rtn As String
Dim key() As Integer
Dim men() As Integer
Dim state(256) As String
men_len = Len(menASCII)
key_len = Len(keyASCII)
'//ASCII key characters
ReDim key(key_len)
For i = 1 To key_len
key(i - 1) = Asc(Mid$(keyASCII, i, 1))
Next
'//ASCII men characters
ReDim men(men_len)
For i = 1 To men_len
men(i - 1) = Asc(Mid$(menASCII, i, 1))
Next
For i = 0 To 255
state(i) = i
Next
x = 0
y = 0
index1 = 0
index2 = 0
For i = 0 To 255
index2 = (key(index1) + state(i) + index2) Mod 256
'swap_byte(state(i), state(index2))
tmp = state(i)
state(i) = state(index2)
state(index2) = tmp
'//
index1 = (index1 + 1) Mod key_len
Next
For i = 0 To men_len - 1
x = (x + 1) Mod 256
y = (state(x) + y) Mod 256
'swap_byte(state(x), state(y))
tmp = state(x)
state(x) = state(y)
state(y) = tmp
'//
xorIndex = (state(x) + state(y)) Mod 256
men(i) = men(i) Xor state(xorIndex)
rtn = rtn + Chr(men(i))
Next
'//Return
alleged_RC4 = rtn
End Function
-
Muchas gracias por el aporte pero te comento que encontre eses codigo y no me servio no se por que tiene que ser igual al que esta hecho en C#, de todos modos muchas gracias otra vez
-
Yo ahora veo si lo paso. Aunque solo se lo básico de c#.
PD: el geshi soporta c# creo que es code=csharp
ahora lo averiguo
edito: si, es [code=csharp]aca el código[/code]
-
HOLA!!!
El base64:
Public Function base64(numero As Integer) As String
Dim Diccionario As String: Diccionario = "0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z + /"
Dim dic() As String: dic = Split(Diccionario)
Dim Cociente As Long: Cociente = 1
Dim Resto As Long
Dim Palabra As String
While Cociente > 0
Cociente = numero / 64
Resto = numero Mod 64
Palabra = dic(Resto) & Palabra
Wend
base64 = Palabra
End Function
El RC4, desconozco "short" asi que no se si funcionara bien aunque con un par de retoques si sabes vb lo haces ;).
Public Function allegedrc4(codigo As String, llavellegada As String) As String
Dim Mensaje As String: Mensaje = vbNullString
Dim Llave As String: Llave = vbNullString
Dim MsgCif As String: MsgCif As String
Dim x As Long
Dim y As Long
Dim Index1 As Long
Dim Index2 As Long
Dim NMen As Long
Dim i As Long
Dim op1 As Single
Dim aux As Long
Dim op2 As Single
Dim nroHEX As String: nroHEX = vbNullString
Mensaje = codigo
Llave = llavellegada
For i = 0 To 255
State(i) = i
Next
For i = 0 To 255
op1 = Asc((Mid(Llave, Index1 + 1, 1))) 'no se que es short suplanto por asc
Index2 = (op1 + State(i) + Index2) Mod 256
aux = State(i)
State(i) = State(Index2)
State(Index2) = aux
Index1 = (Index1 + 1) Mod Len(Llave)
Next
For i = 0 To Len(Mensaje) - 1
x = (x + 1) Mod 256
y = (State(x) + y) Mod 256
aux = State(x)
State(x) = State(y)
State(y) = aux
op1 = Asc((Mid(Llave, Index1 + 1, 1))) 'no se que es short suplanto por asc
op2 = State((State(x) + State(y)) Mod 256)
NMen = op1 ^ op2
nroHEX = DecToHEX(NMen) ' Dec to HEX no incluida
If Len(nroHEX) = 1 Then
nroHEX = "0" & nroHEX
End If
MsgCif = MsgCif & nroHEX
Next
'MsgCif = MsgCif.Substring(MsgCif.Length - (MsgCif.Length)); no le veo logica
allegedrc4 = MsgCif
End Function
GRACIAS POR LEER!!!
-
el short es un tipo de dato numericio pequeño, pero creo que corresponde al integer de vb6, ya que el integer de c# es el long de vb6
-
Short/float = single, numero con coma de precision simple
Double se mantiene con el mismo nombre xD
-
HOLA!!!
XD Single es el ULTIMO tipo que uso es muy limitado e inutil a mi parecer, igual corregi, espero que lo que le hice le arregle las cosas.
GRACIAS POR LEER!!!
-
XD Single es el ULTIMO tipo que uso es muy limitado e inutil a mi parecer
Se ve que nunca programaste 3d por código no? x'D
para que usar double cuando podes usar single cuando no necesitas tanta precisión? (no siempre necesitaras números de 20 cifras o con 30 decimales :P)
-
HOLA!!!
XD!!!
No,solo he hecho un par de figuras 3d por codigo pero nada del otro mundo.
No se te hace mas comodo usar un long y la coma flotante se la creas vos?
(igual yo uso double y pero eso de hacer comas flotantes caseras lo usaba en batch XD)
P.Ej:
single = 3,6
long = 36
GRACIAS POR LEER!!!
-
79137913 muchisimas gracias el codigo Base 64 con dos modificaciones corrio perfecto, estoy muy agradecido con tu persona con respecto a Alleged RC4, lo arregle pero no me dio los resultados que queria, estoy desconsertado
Bueno muchas gracias a todos por sus comentarios y los aportes una vez que termine la aplicaciòn de facturación con el protocolo de CODIGO DE CONTROL que se rige en Bolivia lo subire para compartirlo.
Saludos a todos y otra vez muchas gracias
La Paz - Bolivia
-
Hola otra vez, les comento que acabo de hacer los cambios para que me genere la encriptaciòn Alleged RC4 de acuerdo al pseudocodigo pero cuando la pruebo no me sale los datos de la prueba me podrian ayudar por favor.
RESULTADO QUE DEBERIA TENER:
1. allegedrc4(“d3Ir6”, “sesamo”) -> Resultado: CadenaCifrada = EB06AEF892
2. allegedrc4 (“piWCp”, “Aa1-bb2-Cc3-Dd4”) -> Resultado: CadenaCifrada = 37712E14A0
3. allegedrc4(“IUKYo”, “XBCPY-GKGX4-PGK44-8B632-X9P33”) -> Resultado: CadenaCifrada = 8362FCB0F0
codigo del compañero 79137913 modificado que corre bien pero no me da los resultados de los ejemplos de arriba:
Public Function allegedrc4(codigo As String, llavellegada As String) As String
Dim Mensaje As String: Mensaje = vbNullString
Dim Llave As String: Llave = vbNullString
Dim MsgCif As String:
Dim x As Long
Dim y As Long
Dim Index1 As Long
Dim Index2 As Long
Dim NMen As Long
Dim I As Long
Dim op1 As Integer
Dim aux As Long
Dim op2 As Integer
Dim state(256) As String
Dim nroHEX As String: nroHEX = vbNullString
Mensaje = codigo
Llave = llavellegada
For I = 0 To 255
state(I) = I
Next
For I = 0 To 255
op1 = CStr(Asc(Mid(Llave, Index1 + 1, 1))) 'no se que es short suplanto por asc
Index2 = (op1 + state(I) + Index2) Mod 256
aux = state(I): state(I) = state(Index2): state(Index2) = aux:
Index1 = (Index1 + 1) Mod Len(Llave)
Next
For I = 0 To Len(Mensaje) - 1
x = (x + 1) Mod 256
y = (state(x) + y) Mod 256
'intercambia valor
aux = state(x): state(x) = state(y): state(y) = aux
xorIndex = (state(x) + state(y)) Mod 256
NMen = Asc(Mid(Mensaje,i + 1, 1)) Xor state(xorIndex)
nroHEX = DecToHex(NMen) '
If Len(nroHEX) = 1 Then
nroHEX = "0" & nroHEX
End If
MsgCif = MsgCif & nroHEX
Next
'MsgCif = Mid(MsgCif, 1, Len(Mensaje) - 1)
allegedrc4 = MsgCif
End Function
Public Function DecToHex(ByVal DecNum As Double) As String
Dim remainder As Integer
Dim HexStr As String
HexStr = ""
Do While DecNum <> 0
remainder = DecNum Mod 16
If remainder <= 9 Then
HexStr = Chr(Asc(remainder)) & HexStr
Else
HexStr = Chr(Asc("A") + remainder - 10) & HexStr
End If
DecNum = DecNum \ 16
Loop
If HexStr = "" Then HexStr = "0"
DecToHex = HexStr
End Function
-
Un poquito aburrido de la vida, me puse a pasarlo de pseudo código a vb6, y lo logre :)
Private Sub Form_Load()
Dim s As String
s = AllegedRC4("d3Ir6", "sesamo")
Debug.Print s, s = "EB-06-AE-F8-92"
s = AllegedRC4("piWCp", "Aa1-bb2-Cc3-Dd4")
Debug.Print s, s = "37-71-2E-14-A0"
s = AllegedRC4("IUKYo", "XBCPY-GKGX4-PGK44-8B632-X9P33")
Debug.Print s, s = "83-62-FC-B0-F0"
End
End Sub
Function AllegedRC4(text As String, key As String) As String
Dim state(256) As Integer
Dim x As Integer, y As Integer
Dim Index1 As Integer, Index2 As Integer
Dim NMen As Integer, I As Integer, k As Integer
Dim mensajeCifrado As String
k = Len(key)
For I = 0 To 255
state(I) = I
Next
For I = 0 To 255
Index2 = (Asc(Mid$(key, Index1 + 1)) + state(I) + Index2) Mod 256
Call iSwap(state(I), state(Index2))
Index1 = (Index1 + 1) Mod k
Next
k = Len(text) - 1
For I = 0 To k
x = (x + 1) Mod 256
y = (state(x) + y) Mod 256
Call iSwap(state(x), state(y))
NMen = Asc(Mid$(text, I + 1)) Xor state((state(x) + state(y)) Mod 256)
mensajeCifrado = mensajeCifrado & "-" & Format$(Hex$(NMen), "00")
Next
AllegedRC4 = Mid$(mensajeCifrado, 2)
End Function
Private Sub iSwap(ByRef iVal1 As Integer, ByRef iVal2 As Integer)
' // Autor: BlackZeroX
' // Intercambia {iVal1} por {iVal2} y {iVal2} a {iVal1} sin variable temporal
iVal1 = iVal1 Xor iVal2
iVal2 = iVal2 Xor iVal1
iVal1 = iVal1 Xor iVal2
End Sub
Salida:
EB-06-AE-F8-92 True
37-71-2E-14-A0 True
83-62-FC-B0-F0 True
Y una pregunta, para decodificarlo? El pdf dice que es simétrico, pero parece un tipo de hash :P
-
Gracias raul338, tu codigo funciona al 100% tambièn muchas gracias a todos por sus comentarios y colaboraciones.