RSA。 Java加密.NET解密

我需要实现登录.NET Soap Web Service。 此Web服务有方法

AuthenticateUser(username, password) 

和密码应使用RSA公钥加密。 在我想要做的下面:

  public static final String PUBLIC = "q/9CujExqL6rsMMO22WWIotoXDCw5KEmGQJqL9UJEfoErwZ9ZCm3OwMTSlAMSfoXEMA04Y1rhfYC3MtU/7dYEoREfsvOPGDBWanTKyMzv2otCfiURyQoghEdkhv3ipQQaaErT7lfBKobJsdqJlvxo4PCOUas2Z6YpoMYgthzTiM="; public static final String EXPONENT = "AQAB"; public static PublicKey getPublicKey() throws Exception{ byte[] modulusBytes = Base64.decode(PUBLIC, 0); byte[] exponentBytes = Base64.decode(EXPONENT, 0); BigInteger modulus = new BigInteger(1, (modulusBytes) ); BigInteger exponent = new BigInteger(1, (exponentBytes)); RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, exponent); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePublic(spec); } public static byte[] encrypt(Key publicKey, String s) throws Exception{ byte[] byteData = s.getBytes("UTF-8"); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encryptedData = cipher.doFinal(byteData); return encryptedData; } public static String arrayAsString (byte [] array){ String p = ""; for (int i = 0; i < array.length; i++) { p += unsignedToBytes(array[i]); if (i < array.length - 1) p+= ","; } return p; } public static int unsignedToBytes(byte b) { return b & 0xFF; } public static void main(String[] args){ PublicKey publicKey = getPublicKey(); byte [] encrypted = encode(publicKey, "passwordHere"); String pass = arrayAsString(encrypted); webservice.AuthenticateUser("testAdmin", pass); } 

我也有来自Web Service端的.NET代码

  private static string publicKey = "q/9CujExqL6rsMMO22WWIotoXDCw5KEmGQJqL9UJEfoErwZ9ZCm3OwMTSlAMSfoXEMA04Y1rhfYC3MtU/7dYEoREfsvOPGDBWanTKyMzv2otCfiURyQoghEdkhv3ipQQaaErT7lfBKobJsdqJlvxo4PCOUas2Z6YpoMYgthzTiM=AQAB"; private static UnicodeEncoding _encoder = new UnicodeEncoding(); public static string Encrypt(string data) { var rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(publicKey); var dataToEncrypt = _encoder.GetBytes(data); var encryptedByteArray = rsa.Encrypt(dataToEncrypt, false).ToArray(); var length = encryptedByteArray.Count(); var item = 0; var sb = new StringBuilder(); foreach (var x in encryptedByteArray) { item++; sb.Append(x); if (item < length) sb.Append(","); } return sb.ToString(); } public static string Decrypt(string data) { var rsa = new RSACryptoServiceProvider(); var dataArray = data.Split(new char[] { ',' }); byte[] dataByte = new byte[dataArray.Length]; for (int i = 0; i < dataArray.Length; i++) { dataByte[i] = Convert.ToByte(dataArray[i]); } rsa.FromXmlString(privateKey); var decryptedByte = rsa.Decrypt(dataByte, false); return _encoder.GetString(decryptedByte); } 

有人知道我做错了什么吗? 为什么Web服务总是返回我AuthenticateUserResponse {AuthenticateUserResult = false; }

我认为这里的问题可能与文本编码有关,而不是加密/解密过程本身。 在Java方面,您正在加密UTF-8编码的密码,而在.NET方面,它使用的是UnicodeEncoding ,它是UTF-16。 在加密之前尝试在Java端使用UTF-16。