我想生成一个用密码加密的私钥PKCS8格式,我尝试使用这段代码:
String password = "123456";
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
gen.initialize(2048);
KeyPair key = gen.generateKeyPair();
PrivateKey privateKey = key.getPrivate();
PublicKey publicKey = key.getPublic();
FileOutputStream pvt = new FileOutputStream("d:\\pvt123456.der");
try {
pvt.write(privateKey.getEncoded());
pvt.flush();
} finally {
pvt.close();
}
FileOutputStream pub = new FileOutputStream("d:\\pub123456.der");
try {
pub.write(publicKey.getEncoded());
pub.flush();
} finally {
pub.close();
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用3des加密密码以与openssl格式兼容.
将Bouncy Castle提供程序集成到Java程序中的最佳方法是什么?我知道我可以通过以下方式以编程方式添加它:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
...
Security.addProvider(new BouncyCastleProvider());
Run Code Online (Sandbox Code Playgroud)
或者我可以将它添加到我的机器上的JRE路径中.
什么是最好的选择?
任何人都可以向我展示(或提供一个链接)如何使用充气城堡加密Java文件?我查看过bouncycastle.org但找不到任何API的文档.即使只知道使用哪些课程对我来说也是一个很大的帮助!
我正在构建一个使用BouncyCastle作为加密提供程序的网络应用程序.假设你有这个生成密钥对:
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime192v1");
KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
g.initialize(ecSpec, new SecureRandom());
KeyPair pair = g.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么你得到一个ECDSA KeyPairGenerator 的实例.为什么不说EC呢?我知道BouncyCastle附带了一个ECDH Key类型,但我认为这两个代表关于曲线上的点的相同内容 - 或者我完全错误的背后的理论?
我问的原因是,我现在的应用程序使用ECDH罚款来建立AES密钥,但现在我想使用相同的EC密钥使用ECDSA对每条消息进行签名.
我正在尝试使用C#读取.pem仅包含RSA公钥的文件.我无权访问私钥信息,我的应用程序也不需要它.文件myprivatekey.pem文件以.开头
-----BEGIN PUBLIC KEY-----
最后以
-----END PUBLIC KEY-----.
我目前的代码如下:
Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair keyPair;
using (var reader = File.OpenText(@"c:\keys\myprivatekey.pem"))
keyPair = (Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair)new Org.BouncyCastle.OpenSsl.PemReader(reader).ReadObject();
Run Code Online (Sandbox Code Playgroud)
但是代码会抛出一条InvalidCastException消息
无法将"Org.BouncyCastle.Crypto.Parameters.DsaPublicKeyParameters"类型的对象强制转换为"Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair".
PemReader当没有私钥信息时,如何使用Bouncy Castle 只读公钥?
我正在为3种不同的加密类实现工厂模式.工厂将确定要创建哪一个,然后从数据库中获取正确类的序列化实例并将其返回给请求者.现在我正在编写类以将它们存储在数据库中.我正在写一个名为PGP加密类的BouncyCastle.我可以从文件创建类和键,但是当我尝试序列化它时,它表示两个成员变量,它们是类的对象PgpPublicKey,并且PgpPrivateKey由于它们没有无参数构造函数而无法序列化.
public void createdBouncyFromFiles()
{
var bc = new BouncyCastle("C:\\TestFiles\\BouncyPublicKey.txt", "C:\\TestFiles\\BouncyPrivateKey.txt", "Password1");
var xmlSerializer = new XmlSerializer(bc.GetType());
var textWriter = new StringWriter();
xmlSerializer.Serialize(textWriter, bc);
var theSerializedClass = textWriter.ToString();
}
Run Code Online (Sandbox Code Playgroud)
该类有两个成员变量是问题.
public class BouncyCastle : ICryptographyProvider
{
public PgpPublicKey m_publicKey;
public PgpPrivateKey m_privateKey;
public string m_passPhrase;
// cut out the irelevant parts
Run Code Online (Sandbox Code Playgroud)
这是公钥类.没有无参数的构造函数.
public class PgpPublicKey
{
public PgpPublicKey(PublicKeyAlgorithmTag algorithm, AsymmetricKeyParameter pubKey, DateTime time);
// cut other methods
}
Run Code Online (Sandbox Code Playgroud) 我在阅读证书信息时遇到问题.我想以编程方式在Android中使用带有bouncycastle库的java阅读完整信息.现在,我只是在控制台中使用keytool命令:
>keytool -list -keystore 1.p12 -storetype pkcs12 -v
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我想转换 -
RSA Public Key
modulus: 9699c3c4406464638d2b30dbed44ddee485b5f9a3d7491434049440d34eb1759376a8bac0e37cee5c18df69acfc60d7252634fd15c26ab2afa16ca831598381356209acea9cea9467acdbd2a9b6d8e7b38d1baa826b1fbce2c185ba324bd17c9fdd6558eb57a082ca8c37fccaa86d4f9ffdc4e5d4a4a7f8e5f5410f835f98c64776cfc3421f19db99f140590d871e5e53efce6be8b9daffa3ab876005a48d249378ecc766281e931921e2ef0105fb64fa26952f91ad1627fedbb429aba75d3788bf7c0324f9fc1b48a9f5490ee0ab42e9e4c88ea564943aa5d9f43f7421b7d28788496daf7426f2e193199d4a525b38f0f3f68ab3c37b09fba2cc21f38e7a769
public exponent: 10001
Run Code Online (Sandbox Code Playgroud)
至
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh74GWHRE+YCdi539to51
xpXlJiBI0VvSLbnUwbdKi6UP3HuOPbhVVNNAqyCs/bVIcHdZIap+Pb70Ry04L17H
RsQTOPyl4Us5r7WlzHG4J6p8XU5bl8wS0SU848oABkOIa5D4q0ap0Ryx0SniWPGP
OvPN5qA+cSHwJFgT7Ba/MQB99nJm0iLhnw5QFbtFCb8rCPXHRNYeXwAxUp33oNqZ
IMIWb+DoyyQjwizemiSgQaAk2iEGf7L7N0drlBS9/L/DWvgOOLGNJrK3uZnewNuU
2gma21x60nmWvFBMn87ocGtA4CU6GRrWX0cOvEPL/qXYy/+yA2WpM3op3YW9Hg+i
HQIDAQAB
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
无论是使用标准Java还是BouncyCastle,任何指针都会有所帮助.
我目前正在使用scrypt实现密码哈希.我已经在GitHub上找到了一个很好的scrypt实现.令我惊讶的是,我还在Bouncy Castle图书馆中发现了一个scrypt实现.该类没有记录,维基百科没有提到Bouncy Castle作为scrypt实现提供程序,我真的很难找到使用Bouncy Castles scrypt的人的任何代码示例,所以这看起来有些可疑.
另一方面,如果我不得不在GitHubs加密实现和Bouncy Castle之间做出选择,我宁愿选择Bouncy Castle.
那么Bouncy Castles是否会破坏 "真实的东西"?我可以使用Bouncy Castles scrypt而不是JCA提供者API(或者我需要像这里一样直接调用它:带有充气城堡的scala中的AES-256加密工作流程:盐和IV的使用和传输/存储)?
编辑:我现在可以得到的最佳答案:https://www.bouncycastle.org/devmailarchive/msg13653.html
我正在尝试确定使用Bouncy Castle,托管代码或来自C#的非托管代码对可执行文件进行代码签名的最佳方法.由于CAPICOM现已弃用,我想mssign32.dll中的一个SignerSign方法是最好的方法,如果它需要不受管理.
这个答案(/sf/answers/276656481/)似乎很接近,但它产生一个.p7m文件,虽然看起来是正确的大小,但是无法正常运行(显然在运行之前重命名为.exe) ).
问题提供者在这里提供的解决方案(用于替换signtool.exe的API /库)看起来很有前途和管理,但就像Tom Canham在下面的评论中提到的那样,"这似乎是用于签署封装消息.Authenticode - 代码 - 签署signtool所做的 - 是不同的,这就是为什么签署后EXE不会运行的原因." 当我使用提问者的解决方案或之前引用的Bouncy Castle解决方案签名时,我收到了Tom所做的相同错误.
我还没有尝试过唯一的选择(/sf/answers/450090231/),虽然看起来很有希望,但我并不认为它使用"authenticode"代码签名而不是"封闭的消息"代码签名.这个答案也有不使用现在已弃用的CAPICOM互操作方法的好处,所以我想我今天将使用这种方法报告我的结果.如果这是最好的选择,那么有人可以说出从mssign32.dll导出的SignerSign,SignerSignEx和SignerSignEx2函数之间的区别吗?我已经读过SignerSignEx2应该与Windows 8及更高版本一起使用...
长话短说,我想复制signtool.exe签署.exe文件,.pfx文件和密码的可执行文件的能力,如下所示:
signtool sign /f cert.pfx /p password application.exe
Run Code Online (Sandbox Code Playgroud)
我正在寻找使用authenticode签名以编程方式对可执行文件进行代码签名(PE,如果它很重要)的最佳选项,如果可能的话,我宁愿使用充气城堡或托管代码,尽管我会使用非托管的东西,如果它工作但不是目前已弃用.
谢谢!
bouncycastle ×10
java ×6
c# ×3
security ×2
.net ×1
capicom ×1
encryption ×1
jce ×1
openssl ×1
pem ×1
pkcs#12 ×1
private-key ×1
public-key ×1
scrypt ×1