- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 Java 加密例程,需要用 C# 解密。 Java 例程使用的是我无法在 C# 中复制的 Bouncy CaSTLe 行:
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
这是 Java 代码中对 Bouncy CaSTLe 的唯一引用。
我无法控制 Java 端,只能控制 C# 端。我所有的 C# 解密尝试都给我垃圾数据,与我的 C# 代码相比,我在 Java 代码中发现的唯一差异是 C# 端缺少 Bouncy CaSTLe。有谁知道如何在 C# 中将 BouncyCaSTLe 指定为安全提供程序?我浏览了 Bouncy CaSTLe 的源代码,在他们的网站上和网上都没有找到。
编辑:根据目前的回复,我更新了我的代码以使用 Bouncy CaSTLe。我在下面添加我的 C# 解密代码和 Java 加密代码。当我使用 Bouncy CaSTLe 时,我仍然无法正常解密。我一定是忽略了一些简单的东西,但我看不到它......任何想法都会受到赞赏。
C#解密代码:
public string Decrypt(string stringToDecrypt, string encryption_Key, string init_Vector, string salt)
{
byte[] SALT = Convert.FromBase64String(salt);
int iterations = 12345;
var rfc2898 = new System.Security.Cryptography.Rfc2898DeriveBytes(encryption_Key, SALT, iterations);
byte[] KEY = rfc2898.GetBytes(16);
KeyParameter aesKeyParam = ParameterUtilities.CreateKeyParameter("AES", KEY);
byte[] IV = Encoding.UTF8.GetBytes(init_Vector);
ParametersWithIV aesIVKeyParam = new ParametersWithIV(aesKeyParam, IV);
IBufferedCipher cipher = CipherUtilities.GetCipher("AES/CBC/PKCS5Padding");
cipher.Init(false, aesIVKeyParam);
//byte[] bytesToDecrypt = Convert.FromBase64String(stringToDecrypt);
// Gives me "pad block corrupted" error
//byte[] bytesToDecrypt = Encoding.UTF8.GetBytes(stringToDecrypt);
// Gives me "last block incomplete in decryption" error
byte[] bytesToDecrypt = Base64.Decode(Encoding.UTF8.GetBytes(stringToDecrypt));
// Gives me "pad block corrupted" error
byte[] output = cipher.DoFinal(bytesToDecrypt);
return Convert.ToBase64String(output);
}
Java代码:
public class testaes {
/**
* The iteration count for key generation algorithm.
*/
private static final int KEY_ITERATION_COUNT = 12345;
/**
* The key length in bits.
*/
private static final int KEY_LENGTH = 128;
/**
* The algorithm for cipher initialization.
*/
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
/**
* The algorithm for key factory selection.
*/
private static final String KEY_FACTORY_ALGORITHM = "PBKDF2WithHmacSHA1";
/**
* The algorithm for key generation.
*/
private static final String KEY_ALGORITHM = "AES";
/**
* The byte encoding.
*/
private static final String BYTE_ENCODING = "UTF-8";
private static testaes instance = null;
public testaes() {
super();
}
public static testaes getInstance() {
if (instance == null) {
instance = new testaes();
}
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
return instance;
}
/**
* Instantiates the cipher.
*/
private Cipher initCipher(int opmode) throws Exception, NoSuchAlgorithmException, InvalidKeySpecException,
NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, UnsupportedEncodingException {
String access = "XXXXX";
byte[] salt = "XXXXX".getBytes();
String ivString = "XXXXX";
// Build the key from password and salt.
char[] accessCharArray = access.toCharArray();
byte[] saltByteArray = Base64.decodeBase64(salt);
SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_FACTORY_ALGORITHM);
KeySpec spec = new PBEKeySpec(accessCharArray, saltByteArray, KEY_ITERATION_COUNT, KEY_LENGTH);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secretKey = new SecretKeySpec(tmp.getEncoded(), KEY_ALGORITHM);
// Create a cipher based on AES transformation.
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
// Initialize cipher to with Secret Key and IV.
cipher.init(opmode, secretKey, new IvParameterSpec(ivString.getBytes(BYTE_ENCODING)));
return cipher;
}
/**
* Encrypts the data.
*
* @param originalString
* The data to be encrypted.
* @return The encrypted data as String.
*/
public String encryptAES(String originalString) {
String encryptedString = null;
try {
Cipher cipher = initCipher(Cipher.ENCRYPT_MODE);
byte[] encryptedBytes = cipher.doFinal(originalString.getBytes());
String base64Encoded = new String(Base64.encodeBase64(encryptedBytes), Charset.forName(BYTE_ENCODING));
String urlEncoded = URLEncoder.encode(base64Encoded, BYTE_ENCODING);
encryptedString = urlEncoded;
} catch (Exception e) {
e.printStackTrace();
}
return encryptedString;
}
/**
* Decrypts the data.
*
* @param encryptedString
* The encrypted data that is to be decrypted.
* @return The decrypted (original) data as string.
*/
public String decryptAES(String encryptedString) {
String decryptedString = null;
try {
Cipher cipher = initCipher(Cipher.DECRYPT_MODE);
String urlDecoded = URLDecoder.decode(encryptedString, BYTE_ENCODING);
byte[] encryptedBytes = Base64.decodeBase64(urlDecoded.getBytes(Charset.forName(BYTE_ENCODING)));
byte[] originalBytes = cipher.doFinal(encryptedBytes);
decryptedString = new String(originalBytes);
} catch (Exception e) {
e.printStackTrace();
}
return decryptedString;
}
最佳答案
正如代码评论:“在 C# 中,您要么直接使用 BC 库,要么不使用。这种“提供者”概念不存在。”这类似于在 Java 中使用“轻量级 API”。 Oracle/OpenJDK 定义的 Java JCE API 没有等效项。
关于c# - 如何在 C# 中添加 BouncyCaSTLeProvider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19912273/
我很困惑在哪里添加 jar 文件(bcprov-jdk15-145.jar)来为 BouncyCaSTLeProvider 添加安全文件。在应用程序库或 JRE jre6\lib\ext\文件夹中。
我正在开发一个需要使用 BouncyCaSTLe 库 (bcprov-jdk15-143.jar) 的 android 蜂窝应用程序。我已将此 jar 包含在我的 libs 文件夹中并将其添加到我的构
我有一个 Java 加密例程,需要用 C# 解密。 Java 例程使用的是我无法在 C# 中复制的 Bouncy CaSTLe 行: Security.addProvider(new org.boun
我们在 Adobe ColdFusion 中成功地使用了 AmazonPay API for Java (amazon-pay-api-sdk-java-2.2.2.jar)。我们最近引入了 Lu
我一直在尝试从 openjdk 中找到一种在 Java 11 中使用 BouncyCaSTLeProvider 的方法。由于没有 ext 文件夹,我无法弄清楚将 jar 文件放在哪里。我在 MacOS
我在 Windows 上导出了文件 cert.pfx。该文件包含我的证书。在 Ubuntu 上我可以使用密码打开它并看到证书。但是当我加载这个文件时: BouncyCastleProvider pro
昨天一切运行顺利,但是今天早上我收到了这个错误。我不认为这与我的gradle文件有任何关系,因为在我所有的项目中都发生了此错误。 我收到此错误: Unable to load class 'org.b
我正在学习 BouncycaSTLe 并面临一些问题。是否可以组合多个安全提供程序,例如我修改了我的 java.security 如下: security.provider.11=org.bouncy
我在使用 websphere 配置 Bouncy CaSTLe 时遇到问题。我正在处理 pdf 文档签名,它需要依赖 Bouncy CaSTLe。我正在使用 websphere v8.5、java 6
我尝试按照Ionic's教程构建演示应用程序,但似乎陷入困境。 ionic serve可以很好地启动带有新应用程序的浏览器,但是当我尝试使用Android模拟器或设备时,事情会变得有些困惑。 c:\i
我正在尝试在我全新的 MacBook Pro 上设置 Tomcat 应用程序开发环境。我需要设置一个实现 org.bouncycaSTLe.jce.provider.BouncyCaSTLeProvi
我将 Android Studio 升级到最新版本 (3.0.1)。由于以下错误,现在我无法打开或创建新项目 Error:(1, 0) Unable to load class'org.bouncyc
我正在尝试使用“AES/CFB1/PKCS5Padding”(BouncyCaSTLe 提供程序)创建密码算法,但出现 ArithmeticException: java.lang.Arithmeti
我想对 ssl 连接使用自签名。我正在关注 this发布。 我的问题:创建 keystore 后,我的完整性检查失败。 Keytool-Error: java.io.IOException: KeyS
我创建了一个 Java servlet 并在网络酒店的 Tomcat 服务器上运行它。它应该向 iOS 设备发送推送消息,因此我添加了 JavaPNS。这在我的本地 Tomcat 服务器上运行良好,但
我想研究 nssdb keystore 以从可用别名中提取一些信息。在同一应用程序的其他部分,我使用 BouncyCaSTLeProvider 来处理其他一些安全问题。下面的小代码显示了我如何加载和运
我想创建一个 BKS keystore 类型,为此我正在使用此命令: keytool -genkey -keystore ./test.keystore -alias test -storepass
我使用了BouncyCaSTLeProvider(version is 1.54)来生成RSA keypair,想测试key是否有效。根据 wikipedia 的 RSA 算法 key 如下: 选择两
这是我进程中其中一个连接的堆栈跟踪: "ServerConnection on port 10000 Thread 27" #521 prio=5 os_prio=0 tid=0x0000000002
所以我正在用我的 JRE 设置充气城堡,编辑文件“java.security”。现在,当我运行 gradle 命令时,我收到: C:\temp>gradle Error: Could not find
我是一名优秀的程序员,十分优秀!