当前位置: 首页 > 知识库问答 >
问题:

Android/Java和.Net的AES加密仅部分相同

钱哲茂
2023-03-14

我正在研究在.Net和Java(在Android上)中加密(后来解密)字符串,使用带有密码和初始化向量的AES加密。我让每一端各自的en-和解密单独运行良好,但相比之下,我不断得到不同的结果,因此不允许在一个系统上加密而在另一个系统上解密。我特别不明白为什么加密字节数组的前半部分是相同的,而后半部分是不同的(而所有其他字节数组是完全相同的)?

以下是我从使用的两个加密代码中得到的字节数组:

Java(为了便于比较,在负值上增加了256):[b]202,147,148,168,9,104,213,176,174,157,124,160,54,33,151,246,70,63,184,118,228,50,242,224,231,37,34

.Net:[202、147、148、168、9、104、213、176、174、157、124、160、54、33、151、246109、127、84、129、168、106、21、159、131、67、75、209、166、221、190、243]

我在下面发布了我用于加密的两个代码片段。虽然我正在寻找几个小时以来我做错了什么的提示,但我无法弄清楚我错在哪里。如果有人能指出我看不到的东西,那将是非常好的......

以下是我从两个代码版本中打印出所有相关值时得到的结果:

Android-Output:
    Key (String): 6543210987654321
    IV (String): 1234567890123456
    Input (String): Encrypt_this_text

    Key (Bytes): [54, 53, 52, 51, 50, 49, 48, 57, 56, 55, 54, 53, 52, 51, 50, 49]
    IV (Bytes): [49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54]
    Input (Bytes): [69, 110, 99, 114, 121, 112, 116, 95, 116, 104, 105, 115, 95, 116, 101, 120, 116]

    Encrypted: [-54, -109, -108, -88, 9, 104, -43, -80, -82, -99, 124, -96, 54, 33, -105, -10, 70, 63, -72, 118, -28, 50, -14, -32, -25, 37, 34, 16, 123, 9, -113, 81]
    Encrypted (+256 if <0): [202, 147, 148, 168, 9, 104, 213, 176, 174, 157, 124, 160, 54, 33, 151, 246, 70, 63, 184, 118, 228, 50, 242, 224, 231, 37, 34, 16, 123, 9, 143, 81]

VBNet-Output:
    Key (String)=6543210987654321
    IV (String)=1234567890123456
    Input (String)=Encrypt_this_text

    Key (Byte)=[54, 53, 52, 51, 50, 49, 48, 57, 56, 55, 54, 53, 52, 51, 50, 49]
    IV (Byte)=[49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54]
    Input (Byte)=[69, 110, 99, 114, 121, 112, 116, 95, 116, 104, 105, 115, 95, 116, 101, 120, 116]

    Encrypted=[202, 147, 148, 168, 9, 104, 213, 176, 174, 157, 124, 160, 54, 33, 151, 246, 109, 127, 84, 129, 168, 106, 21, 159, 131, 67, 75, 209, 166, 221, 190, 243]

这是用于生成加密字节数组的java代码:

String skey = "6543210987654321";
String siv = "1234567890123456";
String sinput = "Encrypt_this_text";

byte[] key = skey.getBytes("UTF8");
byte[] iv = siv.getBytes("UTF8");
byte[] input = sinput.getBytes("UTF8");

Cipher cipher = Cipher.getInstance("AES/CBC/ZeroBytePadding");
SecretKeySpec keyspec = new SecretKeySpec(key, "AES" );
IvParameterSpec ivparams = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivparams);

byte[] encrypted = cipher.doFinal(input);

…这是我的网络(在这种情况下是VB)测试代码:

Dim rm As New System.Security.Cryptography.AesManaged

Dim skey As String = "6543210987654321"
Dim siv As String = "1234567890123456"
Dim sinput As String = "Encrypt_this_text"

Dim key() As Byte = System.Text.Encoding.ASCII.GetBytes(skey)
Dim IV() As Byte = System.Text.Encoding.ASCII.GetBytes(siv)
Dim input() As Byte = System.Text.Encoding.ASCII.GetBytes(sinput)

Dim ict As System.Security.Cryptography.ICryptoTransform = rm.CreateEncryptor(key, IV)

Dim encrypted() As Byte = ict.TransformFinalBlock(input, 0, input.Length)

共有1个答案

楚方伟
2023-03-14

这是由于. NET的AesManager. CreateEnculptor中的默认填充是PKCS7。

在Java中,用零填充初始化。

可以通过将 rm 中的填充属性更改为 PaddingMode.Zeros 来覆盖填充。

相关的MSDN文章:MSDN。

 类似资料:
  • 我之所以问这个问题,是因为两天来我读了很多关于crypto AES加密的帖子,就在我以为我得到了它的时候,我意识到我根本没有得到它。 这个帖子是最接近我的问题,我有完全相同的问题,但它没有得到回答: CryptoJS AES加密与JAVA AES解密值不匹配 我得到的是已经加密的字符串(我得到的代码只是为了看看他们是怎么做的),所以修改加密方式不是一个选项。这就是为什么所有类似的问题对我来说都不是

  • 问题内容: 我想使用128位AES加密和16字节密钥对密码进行加密和解密。解密值时出现错误。解密时我丢失任何内容吗? 错误信息 最后我基于@QuantumMechanic答案使用以下解决方案 } 问题答案: 如果对于块密码,您将不使用包含填充方案的转换,则需要使明文中的字节数为该密码的块大小的整数倍。 因此,要么将纯文本填充到16字节的倍数(即AES块大小),要么在创建对象时指定填充方案。例如,您

  • 我试图在Android和PHP端使用AES加密/解密数据,并累犯空答案。 首先,我在Android中生成了对称密钥: 在服务器端,我试图解密数据。我可以解密(从RSA)秘密的AES密钥,并得到它的字符串表示。在客户端(Android)和服务器端(PHP)上是一样的。但是如何使用这个字符串AES密钥来解密数据呢?我尝试了这个(PHP): PHP中的结果: 怎么啦?

  • 我不是一个密码专家,特别是由于OpenSSL有很多缺少的文档,我不确定如何解决这个问题。 我有一个期望接收加密消息的外部系统。提供的唯一示例以这种方式使用OpenSSL: 其中,文件在一行中包含此字符串: 我发现了另一个问题,我能够使用以下代码进行加密: 我不明白的是,我应该如何生成与OpenSSL类似的输出(encryptedData)。我有salt、iv和密文,OpenSSL输出Base64编

  • 客户端: 服务器端:

  • 我尝试在android中加密,在nodejs服务器中解密。我生成了一个AES 128位密钥,并使用AES算法对其进行加密,然后使用RSA算法对生成的密钥进行加密。然后将两者都发送到服务器。但是在服务器端解密时,我认为RSA解密工作正常,但在AES解密中有一个问题。我在服务器端没有收到我在客户端加密的字符串。 这是android端加密的代码: 然后把这个发到服务器端 服务器端的代码如下所示: 这里的