公司一个新项目要和第三方公司的JAVA接口用RSA加密通讯数据。我们这边用的是C#,对方给了JAVA的事例代码,公匙、加密内容的明文串和加密后的密文串。通讯方式就是我们这边把明文用公匙加密,然后发给JAVA接口,他们在用密匙进行解密。
JAVA事例:
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class RsaUtils {
//公匙
public static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBT8KD5nqxWoL3fPkdNSy0kkX7Y+SUnZmi9lsY4TrbHzOF6tfovdHxb1GT+hIQthNWfa5xz6eNNSPvT+yBbhf53/8HlaYbDW1yqz8JdlUl2fQdhuvPyTr+ugVuM5VF4bjQKiHPvpp/l0EPm/snchG2E4UDoWW4PaTdMyUe4G6AEQIDAQAB";
//内容
public static final String text="sss";
//加密后内容密文
public static final String text_Encrypt="GLChgp/vaKEW2ZtfskYlUCiwQracrwbb8P2j/m3GCnCwOKIttW3XBKcbIBHX9/wKrfgKxDk1OWTy7V5uvnZzEJzwPTa/L/NRCqch4xNGZ54c0sD7jfPZycaaKix3R59S7lSKSmVuNPp6JuALEzQ1i48zo8SkvFyPeDSOnGYQsiA=";
/** */
/**
* RSA 最大加密明文大小
*/
private static final int MAX_ENCRYPT_BLOCK = 117;
/** */
/**
* RSA 最大解密密文大小
*/
private static final int MAX_DECRYPT_BLOCK = 128;
public static String encrypt(String value, String publicKey) throws Exception {
byte[] data = value.getBytes(StandardCharsets.UTF_8);
X509EncodedKeySpec x509KeySpec = new
X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePublic(x509KeySpec));
int inputLen = data.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(data, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
out.close();
return Base64.getEncoder().encodeToString(encryptedData);
}
哪位大神能帮把java事例翻译为C#的,然后用公匙加密明文能跟java给的内容加密串对上就行。我这是试过好多种RSA方法,加密后一直都无法跟JAVA提供的内容加密串对上。
你的c#代码能贴出来看下吗?
已解决,原来是理解错了。RSA是非对称加密,用公匙加密,私匙解密。之前还是按照以前的思路,觉得JAVA用公匙加密的串和C#用公匙加密的串应该一样。所以不管怎么换方法对比,两个加密后的串都不一样。后来想通后跟对方要了个私匙加密的串过来,直接在C#用公匙解密,是可以直接通过的。又在C#端用公匙加了个密,发给对方。对方用JAVA的私匙也可以解开。至此解决完毕。其实之前弄的方法是没问题的,只是理解偏差了。