Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Android/Java和.Net的AES加密仅部分相同_C#_Java_Android_Vb.net_Encryption - Fatal编程技术网

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

C# Android/Java和.Net的AES加密仅部分相同,c#,java,android,vb.net,encryption,C#,Java,Android,Vb.net,Encryption,我正在使用带有密码和初始化向量的AES加密对.Net和Java(Android上)中的字符串进行加密(以及稍后的解密)。我得到了各自的en-和解密在每一个方面都运行得很好,但是我在比较中不断得到不同的结果,因此不允许在一个系统上加密,在另一个系统上解密。我特别不明白为什么加密字节数组的前半部分是相同的,而后半部分是不同的(而所有其他字节数组是完全相同的) 以下是我使用的两种加密代码的字节数组: Java(为了便于比较,在已为负值的值上添加了+256):[202147148168,91042131

我正在使用带有密码和初始化向量的AES加密对.Net和Java(Android上)中的字符串进行加密(以及稍后的解密)。我得到了各自的en-和解密在每一个方面都运行得很好,但是我在比较中不断得到不同的结果,因此不允许在一个系统上加密,在另一个系统上解密。我特别不明白为什么加密字节数组的前半部分是相同的,而后半部分是不同的(而所有其他字节数组是完全相同的)

以下是我使用的两种加密代码的字节数组:

Java(为了便于比较,在已为负值的值上添加了+256):[202147148168,9104213176174157,124160,54,33151,246,70,63184118228,50242,224231,37,34,16123,914381]

.Net:[202147148168,9104213,176174157 124 160,54,33,151,246109,127,84,129,168,106,21,159,131,67,75209166,221190,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]
…下面是我的Net(在本例中为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)

这是由于.NET的AesManaged.CreateEncryptor中的默认填充为PKCS7

在Java中,使用零填充进行初始化

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


相关的MSDN文章:。

我会反过来做,将两者都改为PKCS7。除非您知道消息的结尾不是零字节,否则您不能删除
zero
padding。谢谢,我自己永远不会得到这个消息:我以为我在某个地方读到过,网络标准默认为零padding,这就是我故意在java中使用零padding的原因。。。因此,它当然与您的提示一起工作(在VBNet中添加rm.Padding=Security.Cryptography.PaddingMode.zero),反之,使用Cipher-Cipher=Cipher.getInstance(“AES/CBC/PKCS7PADDING”);在Java.I中,second CodesInChaos的注释-PKCS7在大多数情况下更好。注意:1)对明文使用ASCII编码会悄悄地损坏外来字符。改用UTF-8。2) IV和键不应使用ASCII(或UTF-8)。它们是随机二进制值,因此如果必须将它们转换为文本,请使用十六进制或Base64。3) 您必须为每条消息生成一个新的随机IV 4)要抵抗主动攻击,您需要应用MAC。使用加密然后MAC方案。确保在MAC中包含整个密文,包括IV。并使用恒定时间比较进行MAC验证。或者,您也可以选择像GCM这样的身份验证模式,而不是自己编写
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)