我写了一个代码来对一条消息进行签名,该消息显然运行良好,它可以使用DSA私钥(512位)对消息进行签名,然后稍后使用相应的公钥对其进行验证(这里没有问题)。我正在使用Windows 7。
但,
如果要在控制台中验证标志,则openssl命令始终返回:验证失败。
#include <stdio.h>
#include <string.h>
#include <openssl\dsa.h>
#include <openssl\engine.h>
#include <openssl\pem.h>
int main(){
char privkey[] = {
"-----BEGIN DSA PRIVATE KEY-----\n"
"MIH4AgEAAkEA3F41fxvcwGZeFxXg2v0/5SR+cxTizT25QugwZgrC7u2zQYTO1Qu0\n"
"PPDKUrLxkaLzKsUEJbQ1DImnG/FxtRjH7QIVAOp+o1qPhOI4DtnvYS86ynTxhDcF\n"
"AkAyKbiUxJigARuuVVlGn4emXOtrT+Al+gmKbbVFfkS62RhSZexQ9+mBLv0/1R8T\n"
"k37AwuybnflijiPjLxB1ZL00AkA2DXjw+0PJOyrQfn2Q44uHyZMG2WfXqT7CIz26\n"
"ZiIAHDOkZQhOvPLqCKAXfwHgGrgl2JLovhVY8nPMdNk2vJijAhUAzK9TuVobhOE8\n"
"kU0xl8lqaI/PMyg=\n"
"-----END DSA PRIVATE KEY-----"
};
char pubkey[] = {
"-----BEGIN PUBLIC KEY-----\n"
"MIHwMIGoBgcqhkjOOAQBMIGcAkEA3F41fxvcwGZeFxXg2v0/5SR+cxTizT25Qugw\n"
"ZgrC7u2zQYTO1Qu0PPDKUrLxkaLzKsUEJbQ1DImnG/FxtRjH7QIVAOp+o1qPhOI4\n"
"DtnvYS86ynTxhDcFAkAyKbiUxJigARuuVVlGn4emXOtrT+Al+gmKbbVFfkS62RhS\n"
"ZexQ9+mBLv0/1R8Tk37AwuybnflijiPjLxB1ZL00A0MAAkA2DXjw+0PJOyrQfn2Q\n"
"44uHyZMG2WfXqT7CIz26ZiIAHDOkZQhOvPLqCKAXfwHgGrgl2JLovhVY8nPMdNk2\n"
"vJij\n"
"-----END PUBLIC KEY-----"
};
char message[] = {"Hello World!"};
//save message for console test
FILE *message_file = fopen ("message.txt","w");
fwrite(message, strlen(message), 1, message_file);
fclose(message_file);
//save private key for console test
FILE *privkey_file …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用openssl dsa实现,但我对以下细节非常困惑:
命令的选项'-text' openssl dsa ....:输出中的十六进制数字,我是否正确假设那些是字节,因此它们是小端序?
功能BN_bn2hex和BN_hex2bn,他们使用什么Endianess?
在此先感谢您的帮助.
我错过了什么吗?从第25页的FIPS180-2开始,它给出了u1,u2,g ^ u1 mod p,y ^ u2 mod p和v的值.我计算了除了v之外的所有值.但是,当我做数学时,我的计算拒绝为v = 0x8bac1ab66410435cb7181f95b16ab97c92b341c0.相反,我从之前得到v = 0xc5a54698ae8e5b94661134260594ff4e3f488e26,它不等于r.我正在(pow(g, u1, p) * pow(y, u2, p)) % q做计算,pow内置函数在哪里,而不是数学模块函数
我想使用C生成一个私钥和公钥,以便在身份验证过程中使用它们。
您能给我一个基本的例子,用C生成密钥吗?
我发现了这些功能,但我不知道如何使用它们:
DSA * DSA_generate_parameters(int bits,
unsigned char *seed,
int seed_len,
int *counter_ret,
unsigned long *h_ret,
void (*callback)(int, int, void *),
void *cb_arg);
int DSA_generate_key(DSA *dsa);
Run Code Online (Sandbox Code Playgroud)
请帮帮我!
谢谢!:)
我正在构建 DSA 算法。但是我在将 BigInteger 数字与其他 BigInteger 数字进行排名时遇到了问题。这是我想使用的公式:
v = ((g^u1 * y^u2) mod p) mod q
这是我制作的代码:
BigInteger v = g.pow(u1.intValue()).multiply(y.pow(u2.intValue())).mod(p).mod(q);
运行脚本时,错误是:
Exception in thread "main" java.lang.ArithmeticException: BigInteger would overflow supported range
at java.math.BigInteger.reportOverflow(Unknown Source)
at java.math.BigInteger.pow(Unknown Source)
at DSAVerifying.main(DSAVerifying.java:38)
Run Code Online (Sandbox Code Playgroud) 有没有人有一个DSA工作示例,其中包含有关如何计算r,s和验证v == r的简单值.由于这个标准已经存在了一段时间并且在图书馆中实现,例如Java Cryptography Extension,我发现很难找到算法如何工作的例子.
Compute r=(gk mod p) mod q
Compute s=(k-1 * (x * r + i)) mod q
Verifying a signature; again i is the input, and (r,s) is the signature.
u1 = (s-1 * i) mod q
u2 = (s-1 * r) mod q
v = ((gu1 * yu2) mod p) mod q
If v equals r, the signature is valid.
Run Code Online (Sandbox Code Playgroud)
谢谢,
如何以字节数组格式生成DSA算法的公钥和私钥?
我正在尝试使用Android中的SpongyCastle生成ECDSA密钥对。这是代码:
static {
Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
}
public static KeyPair generate() {
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime256v1");
KeyPairGenerator generator = KeyPairGenerator.getInstance("ECDSA", "SC");
generator.initialize(ecSpec, new SecureRandom());
KeyPair keyPair = g.generateKeyPair();
Log.i(TAG, "EC Pub Key generated: " + utils.bytesToHex(keyPair.getPublic().getEncoded()));
Log.i(TAG, "EC Private Key generated: " + utils.bytesToHex(keyPair.getPrivate().getEncoded()));
return generator.generateKeyPair();
}
Run Code Online (Sandbox Code Playgroud)
出现错误是因为我总是得到类似公钥的示例:
3059301306072A8648CE3D020106082A8648CE3D03010703420004483ABA9F322240010ECF00E818C041A60FE71A2BD64C64CD5A60519985F110AEDE6308027D2730303F5E2478F083C7F5BB683DCAC22BFEB62F3A48BD01009F40
和私钥:
308193020100301306072A8648CE3D020106082A8648CE3D030107047930770201010420219AB4B3701630973A4B2917D53F69A4BE6DAD61F48016BFEF147B2999575CB2A00A06082A8648CE3D030107A14403420004483ABA9F322240010ECF00E818C041A60FE71A2BD64C64CD5A60519985F110AEDE6308027D2730303F5E2478F083C7F5BB683DCAC22BFEB62F3A48BD01009F40
站点ECDSA样本给了我“无效的ECDSA签名消息”,它们似乎与那个较小的私有密钥有很大不同,并且总是以在同一站点中生成的“ 04”公共密钥开头。
另外,我的后端验证给我错误“无效点编码0x30”
后端Java方法检查为:
public ECPublicKey getPublicKeyFromHex(String publicKeyHex)
throws NoSuchAlgorithmException, DecoderException, ApplicationGenericException {
byte[] rawPublicKey = Hex.decodeHex(publicKeyHex.toCharArray());
ECPublicKey ecPublicKey = null;
KeyFactory kf = null;
ECNamedCurveParameterSpec ecNamedCurveParameterSpec …Run Code Online (Sandbox Code Playgroud) 有没有人知道DSA攻击背后的数学,其中模数p的p-1只由很小的因子组成.实际上,这不会发生,因为密钥生成器会保证不是这样.
关于为DSA生成良好的输入参数的网上有很多信息,因此很难破解,但如果模数p只有很小的因素,p-1就没有关于如何找到X的信息.
dsa ×10
cryptography ×4
openssl ×4
c ×2
dss ×2
ecdsa ×2
math ×2
bouncycastle ×1
c# ×1
c++ ×1
console ×1
encryption ×1
endianness ×1
java ×1
python ×1
rsa ×1
sign ×1
spongycastle ×1
ssl ×1