.NET和JAVA中BYTE的区别以及JAVA中“DES/CBC/PKCS5PADDING” 加密解密在.NET中的实现

本文探讨了Java客户端调用.NET平台Webservice时遇到的问题,特别是关于byte数组处理上的差异,并提供了一种通过调整编码方式来确保数据正确传输的方法。

场景:java 作为客户端调用已有的一个.net写的server的webservice,输入string,返回字节数组。

问题:返回的值不是自己想要的,跟.net客户端直接调用总是有差距

分析:平台不一样,字节表达不一样 ,经过查询之后,结果如下

.NET和Java中BYTE表达确实不一样,区别如下:

1.有符号和无符号

  •  c#中字节byte的范围是0~255;
  •  java中字节byte的范围是-128~127:

2.高低位顺序不同

  •  比如16位整数10用16进制000A,在.net转换成byte数组是00 0A,而java/flash/flex等转换是0a 00

 

那么在.net中如何解决byte[]到sbyte[] 并能与JAVA平台等效沟通呢?

我原来一直在用Utf8编码,后来看别人发过来的文档,用Defaut的ANSI来实现即可。我~。。。。。。

参考:

  • http://fred-han.iteye.com/blog/1935651
  • http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html

转载于:https://www.cnblogs.com/atwind/p/5234733.html

Java实现Delphi的DES/CBC/PKCS5Padding加解密,需要考虑跨语言加密一致性问题,以及处理填充方式差异等情况。 以下是一个简单的Java代码示例,用于实现DES/CBC/PKCS5Padding加解密: ```java import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public class DESCBCCrypto { private static final String ALGORITHM = "DES"; private static final String TRANSFORMATION = "DES/CBC/PKCS5Padding"; public static String encrypt(String plainText, String key, String iv) throws Exception { DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8)); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)); Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(encryptedBytes); } public static String decrypt(String encryptedText, String key, String iv) throws Exception { DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8)); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)); Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); byte[] decodedBytes = Base64.getDecoder().decode(encryptedText); byte[] decryptedBytes = cipher.doFinal(decodedBytes); return new String(decryptedBytes, StandardCharsets.UTF_8); } } ``` 可以使用以下方式调用上述代码: ```java public class Main { public static void main(String[] args) { try { String plainText = "Hello, World!"; String key = "12345678"; // 8字节密钥 String iv = "abcdefgh"; // 8字节初始向量 String encryptedText = DESCBCCrypto.encrypt(plainText, key, iv); System.out.println("Encrypted: " + encryptedText); String decryptedText = DESCBCCrypto.decrypt(encryptedText, key, iv); System.out.println("Decrypted: " + decryptedText); } catch (Exception e) { e.printStackTrace(); } } } ``` 在实现过程中,要注意当处理的数据长度超过8个字符时,DelphiJava在填充方式上可能存在差异,需要确保填充方式一致,如将填充长度从7改为8以解决加密结果不一致的问题 [^3]。同时,对于Delphi10.2版本,要确保在UTF - 8编码下中文信息的加密解密能够正常进行 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值