接下来的讨论是一个简单的教程,如何在 java 中使用 ECDSA 算法对字符串进行签名,而不使用任何第三方库。但问题是:
这是我的 java 代码中的场景,假设有发送方和接收方:
package sender;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
public class Sign {
public static void main(String[] args) throws Exception {
/*
* Generate a key pair
*/
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
keyGen.initialize(256, random);
KeyPair pair = keyGen.generateKeyPair();
/*
Generate the private and the public key
*/
PrivateKey priv = pair.getPrivate();
/* …Run Code Online (Sandbox Code Playgroud) 我需要使用算法 SHA1RSA ,Rsa 密钥长度 2048 和 64 基本编码,用一个私钥对一些数据进行签名。我的代码是这样的
string sPayload = "";
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("URI");
httpWebRequest.ContentType = "application/json; charset=utf-8";
httpWebRequest.Method = WebRequestMethods.Http.Post;
using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
sPayload = "{\"id\":\"14123213213\"," +
"\"uid\":\"teller\"," +
"\"pwd\":\"abc123\"," +
"\"apiKey\":\"2343243\"," +
"\"agentRefNo\":\"234324324\"}";
httpWebRequest.Headers.Add("SIGNATURE", Convert.ToBase64String(new System.Security.Cryptography.SHA1CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes(sPayload))));
streamWriter.Write(sPayload);
streamWriter.Flush();
streamWriter.Close();
}
System.Net.ServicePointManager.Expect100Continue = false;
HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
string result = streamReader.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)
在标头名称签名中,我需要使用私钥传递签名数据(sPayload)。但是使用上面的代码会出现来自第三方的“无效签名”错误,我不确定加密部分是否正确。
httpWebRequest.Headers.Add("SIGNATURE", Convert.ToBase64String(new System.Security.Cryptography.SHA1CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes(sPayload))));
Run Code Online (Sandbox Code Playgroud)
第三方提供了一个证书(cert、sha1)和密钥。我应该将其参考代码吗?
我有我公司的通配符证书 (*.mycompany.com),现在需要对安装程序可执行文件进行数字签名。我将 Signtool.exe 与生成的包含私钥和证书文件(包括中间证书)的 pfx 文件一起使用,但它总是告诉我没有证书满足所有给定的条件。(在调试输出中,我可以看到通配符证书由 EKU 过滤器过滤,中间证书和根证书由私钥过滤器过滤)。
Windows证书管理器表示通配符证书只能用于服务器和客户端身份验证。我无法将代码签名添加到中间证书所具有的用途中。
是否可以使用此通配符证书进行代码签名?我错过了什么吗?
如何转换这些 192-ECDSA 曲线参数以在 Java Card 中使用?
p = 6277101735386680763835789423207666416083908700390324961279
n = 6277101735386680763835789423176059013767194773182842284081
SEED = 3045ae6f c8422f64 ed579528 d38120ea e12196d5
c = 3099d2bb bfcb2538 542dcd5f b078b6ef 5f3d6fe2 c745de65
b = 64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1
Gx = 188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012
Gy = 07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811
Run Code Online (Sandbox Code Playgroud) 我想用私钥签署消息并用公钥验证它,但我无法让它工作。
这是我对数据进行签名的方式(已编辑,但仍然不起作用):
public static string SignData(string message, string privateKey) {
byte[] plainText = ASCIIEncoding.Unicode.GetBytes(message);
var rsaWrite = new RSACryptoServiceProvider();
rsaWrite.FromXmlString(privateKey);
byte[] signature = rsaWrite.SignData(plainText, new SHA1CryptoServiceProvider());
return Convert.ToBase64String(signature);
}
Run Code Online (Sandbox Code Playgroud)
这是我测试数据的方法(已编辑,仍然不起作用):
public static bool VerifyData(string sign, string publicKey, string orig) {
byte[] signature = Convert.FromBase64String(sign);
byte[] original = ASCIIEncoding.Unicode.GetBytes(orig);
var rsaRead = new RSACryptoServiceProvider();
rsaRead.FromXmlString(publicKey);
if (rsaRead.VerifyData(original, new SHA1CryptoServiceProvider(), signature)) {
return true;
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我将密钥对作为 xml 字符串存储在我的帐户类中。该函数在account.cs的构造函数中执行:
public void addKeys() {
RSACryptoServiceProvider provider = new …Run Code Online (Sandbox Code Playgroud) 今天我们可以看到,可以通过提供图像作为输入来创建新的 PDVisibleSignDesigner 对象,该对象稍后将显示在 PDF 文档中。
new PDVisibleSignDesigner(String filename, InputStream imageStream, int page)
Run Code Online (Sandbox Code Playgroud)
如果通过了绿色复选标记图像(参考:imageStream 参数),则当您的签名有效时,这完全有意义。但今天,即使您的签名无效,它也会显示相同的图像。但从逻辑上讲,人们希望显示不同的图像,例如一些红十字标记。
我们如何使用 pdfbox api 来完成它(我使用的是 2.0.8 版本)?
我想创建一个 Swift 应用程序,在其中填写表单,并使用表单中的数据创建 PDF,并需要在其中附加数字签名。谁能帮我这个?
我创建了一个密钥,并创建了一个子密钥。使用子密钥,我签署了一个文件。验证工作。撤销密钥,验证不成立。这是预期的行为。
但是,如果我尝试使用相同的子密钥签名并验证它仍然有效。我究竟做错了什么?这是我正在做的全部事情:
$ gpg --gen-key
$ gpg -k
/Users/mustafa/.gnupg/pubring.kbx
---------------------------------
pub rsa2048 2019-02-03 [SC] [expires: 2021-02-02]
5DD923FBCF6392A5CB366167D4C0627A07510C6C
uid [ultimate] Mustafa <mustafa91@gmail.com>
sub rsa2048 2019-02-03 [E] [expires: 2021-02-02]
Run Code Online (Sandbox Code Playgroud)
使用编辑键,添加一个子键。
$ gpg --edit-key 5DD923FBCF6392A5CB366167D4C0627A07510C6C
sec rsa2048/D4C0627A07510C6C
created: 2019-02-03 expires: 2021-02-02 usage: SC
trust: ultimate validity: ultimate
ssb rsa2048/E058B91696C43666
created: 2019-02-03 expires: 2021-02-02 usage: E
gpg> addkey
sec rsa2048/D4C0627A07510C6C
created: 2019-02-03 expires: 2021-02-02 usage: SC
trust: ultimate validity: ultimate
ssb rsa2048/E058B91696C43666
created: 2019-02-03 expires: 2021-02-02 usage: E
ssb rsa2048/38616BDAE66E418C
created: 2019-02-03 expires: 2019-02-13 …Run Code Online (Sandbox Code Playgroud) 目前我正在使用 apache pdfbox 创建数字和电子签名。最近我开始了解数字和电子签名中的漏洞,如通用签名伪造 (USF)、增量保存攻击 (ISA) 和签名包装 (SWA)。PDFBox 是自动处理这个问题还是我们需要在代码中额外执行来处理这个问题
security electronic-signature digital-signature protect-from-forgery pdfbox
我使用数字签名自动对 Excel 文件中的 VBA 代码进行签名,使用 X509Certificate2 和 EPPlus 时效果很好。现在我想包括一个时间戳,知道我可以在哪里设置吗?
如果我在 VBA 编辑器 - 工具 - 数字签名中手动对代码进行签名,则该代码带有时间戳(和副签名)。因此,当签名人的证书过期时,它仍然有效。但是当使用 EPPlus 签名时则不然。在 ExcelVBASignature.cs 中,看起来这个函数还没有准备好..
到目前为止,我是这样做的:
using System;
using System.IO;
using OfficeOpenXml;
using System.Security.Cryptography.X509Certificates;
...
X509Certificate2 cert = new X509Certificate2 ( PFXfile, PFXpass, X509KeyStorageFlags.PersistKeySet );
using ( ExcelPackage xl = new ExcelPackage ( new System.IO.FileInfo ( Excelfile ) ) )
{
using ( ExcelWorkbook wb = xl.Workbook )
{
wb.VbaProject.Signature.Certificate = cert;
xl.SaveAs ( new System.IO.FileInfo ( TargetPath ) );
}
}
Run Code Online (Sandbox Code Playgroud) cryptography ×3
c# ×2
ecdsa ×2
pdf ×2
pdfbox ×2
rsa ×2
certificate ×1
encoding ×1
epplus ×1
gnupg ×1
httprequest ×1
java ×1
javacard ×1
jce ×1
security ×1
sign ×1
ssl ×1
swift ×1
vba ×1
verification ×1