gpt4 book ai didi

c# - 使用 java 和 WP7 进行 AES 加密

转载 作者:行者123 更新时间:2023-12-01 17:35:15 25 4
gpt4 key购买 nike

我们有 Java 中的 AES-128 加密代码,并且我们需要 WP7 中的一些等效代码。

但是,我们遇到了一个问题:两种实现产生不同的加密文本

这是我们正在使用的代码:

Java 代码

package com.emap.services;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AESEcrypt1 {

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

public String encryptData() {
String message = "Testing AES encryption-decryption amlgorithm for WP7.";
String encryptedStr = "";
try {
SecretKeySpec skeySpec = new SecretKeySpec("Passkey".getBytes(), "AES");
IvParameterSpec iv = new IvParameterSpec(ibv);
// Instantiate the cipher
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(message.getBytes());
encryptedStr = Base64.encode(encrypted);
} catch (BadPaddingException ex) {
System.out.println("Error: " + ex.getMessage());
encryptedStr = "error";
} catch (IllegalBlockSizeException ex) {
System.out.println("Error: " + ex.getMessage());
encryptedStr = "error";
} catch (InvalidAlgorithmParameterException ex) {
System.out.println("Error: " + ex.getMessage());
encryptedStr = "error";
} catch (InvalidKeyException ex) {
System.out.println("Error: " + ex.getMessage());
encryptedStr = "error";
} catch (NoSuchAlgorithmException ex) {
System.out.println("Error: " + ex.getMessage());
encryptedStr = "error";
} catch (NoSuchPaddingException ex) {
System.out.println("Error: " + ex.getMessage());
encryptedStr = "error";
} catch (Exception ex) {
System.out.println("Error: " + ex.getMessage());
encryptedStr = "error";
}
System.out.println("Encrypted: " + encryptedStr);
return encryptedStr;
}
}

WP7代码

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

public string Encrypt(string dataToEncrypt, string password)
//public string Encrypt(string dataToEncrypt)
{
AesManaged aes = null;
MemoryStream memStream = null;
CryptoStream crStream = null;
try
{
//Generate a Key based on a Password and Salt
//Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt));
Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, ibv);
aes = new AesManaged();
aes.Key = rfc2898.GetBytes(aes.KeySize / 8);
aes.IV = rfc2898.GetBytes(aes.BlockSize / 8);
memStream = new MemoryStream();
crStream = new CryptoStream(memStream, aes.CreateEncryptor(), CryptoStreamMode.Write);
byte[] data = Encoding.UTF8.GetBytes(dataToEncrypt);
crStream.Write(data, 0, data.Length);
crStream.FlushFinalBlock();

//Return Base 64 String
return Convert.ToBase64String(memStream.ToArray());
}
finally
{
//cleanup
if (crStream != null)
crStream.Close();
if (memStream != null)
memStream.Close();
if (aes != null)
aes.Clear();
}
}

任何帮助将不胜感激。

最佳答案

请注意,在 Java 中,密码指定由三个部分组成 - 算法、模式(CBC 与 ECB 等)和填充。您必须匹配所有三个,而不仅仅是算法。如果 WP7 不允许您显式指定模式和填充,请找出它们并在 Java 端进行匹配。

哦,请确保 key 是相同的。从示例中看不出来。

编辑:对于调试填充问题,一个简单的键是一个很大的帮助。也就是说,使算法将其明文副本作为密文发出的 key 。例如,对于 RSA,它的公共(public)指数为 1。不确定 AES 的一个简单 key 是什么 - 尝试全部为零。

关于c# - 使用 java 和 WP7 进行 AES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7094777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com