AES从Java应用程序发送32字节,从C#应用程序仅读取29字节

AES从Java应用程序发送32字节,从C#应用程序仅读取29字节,c#,java,sockets,encryption-asymmetric,C#,Java,Sockets,Encryption Asymmetric,一所大学的邮件收发室迫切需要新的软件来帮助其运作。当前的程序是在90年代初用他们认为是python编写的。另外两个人和我,正在使它现代化。我负责网络和服务器。学校要求我们对通过网络发送的任何敏感学生数据进行加密。因为我们使用的是两种不同的语言(Java和C),所以我不得不进行一些挖掘,以找到加密中的共性。AES128/CBC/ISO1026是通用的。我遇到的问题是,如果我向客户端发送服务器密钥和IV,以便客户端可以加密并返回会话密钥和IV,当服务器读取它时,我丢失了3个字节的数据,我根本无法对其

一所大学的邮件收发室迫切需要新的软件来帮助其运作。当前的程序是在90年代初用他们认为是python编写的。另外两个人和我,正在使它现代化。我负责网络和服务器。学校要求我们对通过网络发送的任何敏感学生数据进行加密。因为我们使用的是两种不同的语言(Java和C),所以我不得不进行一些挖掘,以找到加密中的共性。AES128/CBC/ISO1026是通用的。我遇到的问题是,如果我向客户端发送服务器密钥和IV,以便客户端可以加密并返回会话密钥和IV,当服务器读取它时,我丢失了3个字节的数据,我根本无法对其进行解密。下面是我在服务器端读到的东西被发送回来后的情况

        ICryptoTransform decrypter = myProvider.CreateDecryptor(myProvider.Key, myProvider.IV);
        byte[] sKey = new byte[myClient.ReceiveBufferSize];
        Console.WriteLine(ASCIIEncoding.ASCII.GetString(sKey));
        Console.WriteLine("Key Length: " + sKey.Length);
        byte[] sessionKey = new byte[sKey.Length];
        sessionKey = decrypter.TransformFinalBlock(sessionKey, 0, sessionKey.Length);

知道是什么原因导致我丢失了3字节的数据吗?通常情况下,我不会感到不安,但是三字节对安全连接很重要。

您可能需要考虑PKCS5填充而不是ISO10126。我以前没有听说过ISO10126,甚至不知道它的Java实现。我不确定这是否是你的问题的原因。如果看不到Java代码,这将是一个挑战。你是说密码文本缺少3个字节,还是解密的密码文本缺少3个字节?另外,既然可以使用SSL,为什么还要使用自己的加密呢?C#不支持PKCS5。它使用PKCS7。我会使用SSL,但java会抛出一个关于坏服务器证书(自颁发、自签名)的错误,然后C#会抛出一个关于未处理SSPI调用的错误。这就是为什么我要进行自己的加密。是的,我是说,密码文本在被C#应用程序读取后,丢失了3个字节。但是当java应用程序发送它时,它会向控制台发送正在发送的32个字节。您可以通过使用
keytool
或Portecle将可信证书添加到
$java_HOME/jre/lib/security/cacerts
,甚至为您的连接指定不同的信任库,轻松修复SSL证书错误。