// 私钥加密 public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception { PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, privateKey); return cipher.doFinal(data); } /** * 加密 * @param data 待加密数据 * @param key 密钥 * @return byte[] 加密数据 */ public static byte[] encrypt(byte[] data, byte[] key) throws Exception{ //还原密钥 Key k = toKey(key); /** * 实例化 * 使用PKCS7Padding填充方式,按如下代码实现 * Cipher.getInstance(CIPHER_ALGORITHM,"BC"); */ Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); //初始化,设置为解密模式 cipher.init(Cipher.ENCRYPT_MODE, k); //执行操作 return cipher.doFinal(data); }
目前做银联无卡支付借口,银联方面要求传送的格式是如下,但是目前老是传过去报错,说无法解密数据,通过询问说是第二段(BASE64(RSA(报文加密密钥)))有问题,而官方提供的java版本如上,求助严格转换成.NET代码。
加密报文体格式:BASE64(商户号)| BASE64(RSA(报文加密密钥))| BASE64(3DES(报文原文))
// 私钥加密 public static byte[] encryptByPrivateKey(byte[] data, byte[] key) { PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, privateKey); return cipher.doFinal(data); } /** * 加密 * @param data 待加密数据 * @param key 密钥 * @return byte[] 加密数据 */ public static byte[] encrypt(byte[] data, byte[] key) { //还原密钥 Key k = toKey(key); /** * 实例化 * 使用PKCS7Padding填充方式,按如下代码实现 * Cipher.getInstance(CIPHER_ALGORITHM,"BC"); */ Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); //初始化,设置为解密模式 cipher.init(Cipher.ENCRYPT_MODE, k); //执行操作 return cipher.doFinal(data); }
问题是有些类.net不存在,比如PKCS8EncodedKeySpec这个对应什么?
Cipher这个又是什么?
@hengxinyi:
PKCS8EncodedKeySpec:应该是一个私钥加密规范类,在.net里有类似的,具体的,要你去了解这个类的功能再确定.net的类。
Cipher:也是一个加密类,一样的要你弄明白这个类的公用后替代,我对java而言是文盲。
只提供JAVA DEMO代码?没有.NET的版本么!这是什么银行,这么2