2016-07-29 6 views
1

Ich habe eine Datei, die "Hola mundo" in Openssl enthält, mit dem folgenden Befehl verschlüsselt. Dann möchte ich diese Datei mit C# entschlüsseln.TripleDES-Verschlüsselung in OpenSSL und Entschlüsselung mit C#

enc -des-ede -nosalt -in ArchivoNormal.txt -pass file:MiCertificado.cer -out ArchivoEncryptadoTDEOpenSSL.txt 

1) Um den öffentlichen Schlüssel von MiCertificado.cer

private byte[] GenerateKey() 
{ 
    X509Certificate2 cer = new X509Certificate2(); 
    cer.Import("D:\\MiCertificado.cer"); 

    TripleDESCryptoServiceProvider desCrypto = (TripleDESCryptoServiceProvider)TripleDESCryptoServiceProvider.Create(); 

    byte[] results = cer.GetPublicKey(); 

    MD5 md5 = MD5.Create(); 
    int preKeyLength = results.Length; 
    byte[] prekey = null; 
    prekey = new byte[preKeyLength]; 
    Buffer.BlockCopy(results, 0, prekey, 0, results.Length); 
    byte[] key = md5.ComputeHash(prekey); 

    md5.Clear(); 
    md5 = null; 

    return key; 
} 

2) Um das zu bekommen, die verschlüsselte Datei

private void DecryptFile(string source, string destination, byte[] bkey) 
{ 
    TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider(); 

    TDES.Mode = CipherMode.ECB; 
    TDES.Padding = PaddingMode.PKCS7; 
    TDES.KeySize = 192; 
    TDES.BlockSize = 64; 
    TDES.Key = bkey; 

    FileStream fsread = new FileStream(source, FileMode.Open, FileAccess.Read);   
    ICryptoTransform desdecrypt = TDES.CreateDecryptor(); 
    CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read); 

    StreamWriter fsDecrypted = new StreamWriter(destination); 
    fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd()); 
    fsDecrypted.Flush(); 
    fsDecrypted.Close(); 
} 

Es gibt einen Fehler „Datos Incorrectos zu entschlüsseln "

enter image description here

+1

Verwenden Sie nicht 3DES, verwenden Sie AES, es ist der Advanced Encryption Standard, nicht schwieriger zu verwenden und sicherer. – zaph

+0

Es stimmt, aber dieses Mal muss ich 3DES verwenden, das kann ich nicht ändern. – EduardoUstarez

+1

Ah ja, Sicherheit ist zweitrangig. – zaph

Antwort

1

OpenSSL verwendet das Zertifikat in Ihrem Beispiel nicht als Zertifikat, es verwendet lediglich den Inhalt der Datei als Kennwort. Anschließend wird dieses Kennwort in einen geeigneten Schlüssel/IV für Ihre 3DES-Operation mit EVP_BytesToKey umgewandelt, wobei MD5 als Digest verwendet wird, da Sie keinen angegeben haben.

Da es nur die Datei als Bytes liest, die es von DER zu PEM-Codierung ändert, oder PEM-Codierung mit zusätzlichen Leerzeichen wird Ihre verschlüsselte Ausgabe ändern.

Wenn Sie erwarten, etwas zu tun, wenn der öffentliche Schlüssel des Zertifikats hier, dann ist Ihr openssl Befehl nicht richtig.

+0

Um @ Bartons Kommentar zu erweitern * "Wenn Sie etwas erwarten, wenn der öffentliche Schlüssel des Zertifikats hier ist, dann ist Ihr openssl-Befehl nicht richtig" *, sollten Sie PFX und PKCS12 untersuchen. – jww

Verwandte Themen