• Fuentes

 #492926  por Slek
 
El cifrado XOR simple tiene la ventaja de ser sencillo y rápido. Sin embargo, a la hora de cifrar ejecutables la clave puede quedar expuesta, y la mayoría de las veces se puede averiguar muy fácilmente (con mera inspección visual).

Uno de los principales motivos de la debilidad de este método es que el cifrado se realiza, generalmente, en modo ECB. Cualquiera de los otros modos de operación podrían solucionar este problema, pero quería una única función que realizase las dos operaciones: cifrado y descifrado, como el XOR simple. Sinceramente, me daba pereza implementar dos algoritmos distintos...

Sin más, este es código:
'by Slek @ 17.10.17

Private Declare Function ExXOR Lib "USER32" Alias "CallWindowProcW" (ByRef first_asm As Currency, ByRef data() As Byte, ByVal key As String, Optional ByVal null0 As Long = 0, Optional ByVal null1 As Long = 0) As Long

Public Sub ExtendedXOR(ByRef bvData() As Byte, ByRef sKey As String)
    Dim asm(11)     As Currency
    
    'asm
    asm(0) = [email protected]: asm(1) = [email protected]: asm(2) = [email protected]: asm(3) = [email protected]
    asm(4) = [email protected]: asm(5) = [email protected]: asm(6) = [email protected]: asm(7) = [email protected]
    asm(8) = [email protected]: asm(9) = [email protected]: asm(10) = [email protected]: asm(11) = [email protected]
    
    Call ExXOR(asm(0), bvData, sKey)
End Sub
Es un cifrado XOR de 32-bit en modo CTR implementado en ASM. Acepta una cadena de caracteres de cualquier longitud como clave, a partir de la cual se obtiene la clave real de 32-bits. El vector de inicialización (IV) está hardcodeado (no quería añadir ningún parámetro más). La función g(i) es la rotación de 33-bits asociada a la suma del IV con i menos una constante (constante en la ejecución, pero realmente es la longitud del mensaje), repetida el número de veces que indica el último byte de la suma anterior. El código ASM del algoritmo, si a alguien le interesa, está disponible en mi github.

Ejemplo de uso:
ExtendedXOR bvData, "Key"
El resultado es un cifrado rápido y pseudoaleatorio, aunque hay que tener en cuenta (desde el punto de vista de la seguridad) que, en el fondo, sigue siendo un cifrado XOR.

Cualquier duda preguntad.

Un saludo!