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

标签 c# java .net windows-phone-7 encryption

我们有 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/

相关文章:

c# - Unity、RegisterType<> 和 Singleton 对象

.net - windows程序员转mac指南

c# - 如何在 NServiceBus 中实现访问控制处理程序

c# - 如何更新已从 BOT 发送给用户的自适应卡?

java - 为什么 Double.MIN_VALUE 不是负数

java - 从 PL/SQL 调用/使用 JMS

java - Selenium WebDriver 无法切换到弹出窗口

.net - 实体命令执行异常 : Invalid column name 'Entity_Id'

c# - PreviewMouseLeftButtonDown 干扰点击选择

c# - 套接字数据包转发