2016-03-15 2 views
-1

У меня есть метод шифрования/дешифрования в питона записывается какГлядя равноценного окна телефон C# код для питона AES шифрования MODE_CBC

import base64 
from Crypto.Cipher import AES 


def get_encrypted_message(message): 
    """Return encrypted message.""" 
    length = 16 - (len(message) % 16) 
    message += chr(length) * length 
    cipher = AES.new('abcdefghijklmnopqrstuvwxyz123456', 
        AES.MODE_CBC, 16 * '\x00') 
    message = cipher.encrypt(message) 
    return base64.b64encode(message) 


def get_decrypted_message(message): 
    """Return decrypted message.""" 
    if not message: 
     return 
    message = base64.b64decode(message) 
    cipher = AES.new(
     'abcdefghijklmnopqrstuvwxyz123456', AES.MODE_CBC, 16 * '\x00') 
    msg = cipher.decrypt(message) 
    return msg.strip() 


ENCRYPTED_MSG = get_encrypted_message('123') 
print ENCRYPTED_MSG   # 5pRIk9MDE3z9caf/ayilIA== 
print get_decrypted_message(ENCRYPTED_MSG) # 123 

Я сейчас ищу эквивалентном Windows Phone 8.1 C# AES метод шифрования алгоритма. Я новичок в разработке Windows-телефона, и в своем приложении мне приходится запрашивать данные, передавая зашифрованные данные.

Просьба направлять или помогать в написании этого простого кода. Поскольку мне очень сложно получить winphone 8.1 C# algo, я не вижу, чтобы какой-либо AES-алго был доступен или нет, поскольку он был доступен в 8.

Спасибо!

ответ

1

WP 8.1 и WinRT

public static string Encrypt2(string password, string plainText) 
{ 
    IBuffer passwordBuffer = CryptographicBuffer.ConvertStringToBinary(password, BinaryStringEncoding.Utf8); 
    IBuffer plainBuffer = CryptographicBuffer.ConvertStringToBinary(plainText, BinaryStringEncoding.Utf8); 
    IBuffer iv = WindowsRuntimeBuffer.Create(16); 

    SymmetricKeyAlgorithmProvider symProvider = SymmetricKeyAlgorithmProvider.OpenAlgorithm("AES_CBC_PKCS7"); 
    // create symmetric key from derived password key 
    CryptographicKey symmKey = symProvider.CreateSymmetricKey(passwordBuffer); 

    // encrypt data buffer using symmetric key and derived salt material 
    IBuffer encryptedBuffer = CryptographicEngine.Encrypt(symmKey, plainBuffer, iv); 
    string encryptedText = CryptographicBuffer.EncodeToBase64String(encryptedBuffer); 
    return encryptedText; 
} 

public static string Decrypt2(string password, string encryptedText) 
{ 
    IBuffer passwordBuffer = CryptographicBuffer.ConvertStringToBinary(password, BinaryStringEncoding.Utf8); 
    IBuffer encryptedBuffer = CryptographicBuffer.DecodeFromBase64String(encryptedText); 
    IBuffer iv = WindowsRuntimeBuffer.Create(16); 

    SymmetricKeyAlgorithmProvider symProvider = SymmetricKeyAlgorithmProvider.OpenAlgorithm("AES_CBC_PKCS7"); 
    // create symmetric key from derived password material 
    CryptographicKey symmKey = symProvider.CreateSymmetricKey(passwordBuffer); 

    // encrypt data buffer using symmetric key and derived salt material 
    IBuffer plainBuffer = CryptographicEngine.Decrypt(symmKey, encryptedBuffer, iv); 
    string plainText = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, plainBuffer); 
    return plainText; 
} 

ВСЕ ОСТАЛЬНОЕ

public static string Encrypt(string password, string plainText) 
{ 
    using (var aes = new AesManaged()) 
    { 
     aes.Key = Encoding.UTF8.GetBytes(password); 
     aes.IV = new byte[16]; 
     aes.Padding = PaddingMode.PKCS7; 
     aes.Mode = CipherMode.CBC; 

     byte[] plainBuffer = Encoding.UTF8.GetBytes(plainText); 

     using (MemoryStream input = new MemoryStream(plainBuffer)) 
     using (MemoryStream output = new MemoryStream()) 
     using (ICryptoTransform encryptor = aes.CreateEncryptor()) 
     using (CryptoStream cs = new CryptoStream(output, encryptor, CryptoStreamMode.Write)) 
     { 
      input.CopyTo(cs); 
      cs.FlushFinalBlock(); 
      string encryptedText = Convert.ToBase64String(output.GetBuffer(), 0, (int)output.Length); 
      return encryptedText; 
     } 
    } 
} 

public static string Decrypt(string password, string encryptedText) 
{ 
    using (var aes = new AesManaged()) 
    { 
     aes.Key = Encoding.UTF8.GetBytes(password); 
     aes.IV = new byte[16]; 
     aes.Padding = PaddingMode.PKCS7; 
     aes.Mode = CipherMode.CBC; 

     byte[] encryptedBuffer = Convert.FromBase64String(encryptedText); 

     using (MemoryStream input = new MemoryStream(encryptedBuffer)) 
     using (MemoryStream output = new MemoryStream()) 
     using (ICryptoTransform decryptor = aes.CreateDecryptor()) 
     using (CryptoStream cs = new CryptoStream(input, decryptor, CryptoStreamMode.Read)) 
     { 
      cs.CopyTo(output); 
      string plainText = Encoding.UTF8.GetString(output.GetBuffer(), 0, (int)output.Length); 
      return plainText; 
     } 
    } 
} 

Обратите внимание, что есть небольшая проблема: Я использую UTF8 для кодирования как password и strPlainText, но python использует bytestring для всего, и bytestring кодирует агностик (см. What is a Python bytestring?).

Пример использования:

string result = Encrypt("abcdefghijklmnopqrstuvwxyz123456", "123"); // 5pRIk9MDE3z9caf/ayilIA== 
string decrypted = Decrypt("abcdefghijklmnopqrstuvwxyz123456", result); // 123 

Метод возвращает тот же результат, как зашифрованный вашем примере.

Небольшой проблемой этого фрагмента кода является то, что IV (вектор инициализации) инициализируется пустым бифферентом (new byte[16] и 16 * '\x00' в Python). Это «плохая привычка». Даже с использованием Cyphermode CBC считается «плохим».

+0

пароль SALT правильно? –

+0

@LoveSharma Пароль 'abcdefghijklmnopqrstuvwxyz123456' как в вашем примере. – xanatos

+0

Я пытаюсь использовать AesManaged в универсальном приложении Windows Phone 8.1 - Я не вижу доступного пакета. Как установить пакет, содержащий пакет? –

 Смежные вопросы

  • Нет связанных вопросов^_^