2017-02-09 246 views
0

我需要的是在AES一个字符串SHA256与相同的加密钥匙 java代码加密是AES加密,SHA256


private static final String AES_KEY = "something"; 

String encodedText = null; 
try { 
    final MessageDigest md = MessageDigest.getInstance("SHA-256"); 
    final byte[] digestOfPassword = md.digest(AES_KEY.getBytes("utf-8")); 
    final SecretKey key = new SecretKeySpec(digestOfPassword, "AES"); 
    final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    final IvParameterSpec iv = new IvParameterSpec(new byte[16]); 
    cipher.init(Cipher.ENCRYPT_MODE, key, iv); 
    final byte[] plainTextBytes = orignalText.getBytes("utf-8"); 
    final byte[] encodeTextBytes = cipher.doFinal(plainTextBytes); 

    encodedText = new Base64().encodeToString(encodeTextBytes); 

} 

,但我需要在C#中等价,我是什么能够发展为

private static byte[] ivBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 
    0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 

// keyBytes 
private static byte[] keyBytes = new byte[] { 0x60, 0x3d, (byte) 0xeb, 
    0x10, 0x15, (byte) 0xca, 0x71, (byte) 0xbe, 0x2b, 0x73, 
    (byte) 0xae, (byte) 0xf0, (byte) 0x85, 0x7d, 0x77, (byte) 0x81, 
    0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, (byte) 0xd7, 0x2d, 
    (byte) 0x98, 0x10, (byte) 0xa3, 0x09, 0x14, (byte) 0xdf, 
    (byte) 0xf4 }; 

public string AES_Encrypt(string ToBeEncrypted, string password) 
{ 
    RijndaelManaged aes = new RijndaelManaged(); 

    aes.BlockSize = 128; 
    aes.KeySize = 256; 

    // It is equal in java 
    /// Cipher _Cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");  
    aes.Mode = CipherMode.CBC; 
    aes.Padding = PaddingMode.PKCS7; 

    SHA256 sha = new SHA256Managed(); 
    aes.Key = sha.ComputeHash(Encoding.UTF8.GetBytes(password)); 
    aes.IV = ivBytes; 

    ICryptoTransform encrypto = aes.CreateEncryptor(); 

    byte[] plainTextByte = ASCIIEncoding.UTF8.GetBytes(ToBeEncrypted); 
    byte[] CipherText = encrypto.TransformFinalBlock(plainTextByte, 0, plainTextByte.Length); 

    string enc = BitConverter.ToString(CipherText).Replace("-", string.Empty); 
    return Convert.ToBase64String(CipherText) + "----"+ Convert.ToBase64String(ASCIIEncoding.UTF8.GetBytes(enc)); 
} 

我非常困惑与AES和PKCS5Padding术语SHA256。我使用了与加密相同的密钥,但无法获得与Java代码相同的输出。

回答

1

在Java中使用的是空/零点:IV

final IvParameterSpec iv = new IvParameterSpec(new byte[16]); 

在C#既然你兼具您使用000102030405060708090A0B0C0D0E0F

private static byte[] ivBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 
    0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 

执行加密和你比较加密结果,这将对输出产生巨大影响。 (如果一个解密,另一个加密错误将限制在前16个字节)。

我也不得不指出SHA-2-256是一个可怕的密钥派生函数。如果你想把密码变成密钥,你应该使用真正的KDF,比如PBKDF2(基于密码的密钥派生函数(版本)2)。在.NET中,它的实现为Rfc2898DeriveBytes。在Java中,它似乎是“PBKDF2WithHmacSHA1”SecretKeyFactory

+0

谢谢你指出我的错过。我会检查你的其他建议。非常感谢你 。 :) – hsehb