- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 this MSDN article 中给出的示例关于 DSACryptoServiceProvider
类。问题是每次运行代码时我都会得到不同的签名。
我尝试了 OpenSSL 并没有遇到这个问题,但这次我需要使用 System.Security.Cryptography。
这是一些源代码:
这是要签名的散列值
byte[] HashValue =
{
59, 4, 248, 102, 77, 97, 142, 201,
210, 12, 224, 93, 25, 41, 100, 197,
213, 134, 130, 135
};
这就是问题所在
// The value to hold the signed value.
byte[] SignedHashValue1 = DSASignHash(HashValue, privateKeyInfo, "SHA1");
byte[] SignedHashValue2 = DSASignHash(HashValue, privateKeyInfo, "SHA1");
我使用调试器找出 SignedHashValue1
不等于 SignedHashValue2
using System;
using System.Security.Cryptography;
public class DSACSPSample
{
public static void Main()
{
try
{
DSAParameters privateKeyInfo;
DSAParameters publicKeyInfo;
// Create a new instance of DSACryptoServiceProvider to generate
// a new key pair.
using (DSACryptoServiceProvider DSA = new DSACryptoServiceProvider())
{
privateKeyInfo = DSA.ExportParameters(true);
publicKeyInfo = DSA.ExportParameters(false);
}
// The hash value to sign.
byte[] HashValue =
{
59, 4, 248, 102, 77, 97, 142, 201,
210, 12, 224, 93, 25, 41, 100, 197,
213, 134, 130, 135
};
// The value to hold the signed value.
byte[] SignedHashValue = DSASignHash(HashValue, privateKeyInfo, "SHA1");
// Verify the hash and display the results.
bool verified = DSAVerifyHash(HashValue, SignedHashValue, publicKeyInfo, "SHA1");
if (verified)
{
Console.WriteLine("The hash value was verified.");
}
else
{
Console.WriteLine("The hash value was not verified.");
}
}
catch (ArgumentNullException e)
{
Console.WriteLine(e.Message);
}
}
public static byte[] DSASignHash(byte[] HashToSign, DSAParameters DSAKeyInfo,
string HashAlg)
{
byte[] sig = null;
try
{
// Create a new instance of DSACryptoServiceProvider.
using (DSACryptoServiceProvider DSA = new DSACryptoServiceProvider())
{
// Import the key information.
DSA.ImportParameters(DSAKeyInfo);
// Create an DSASignatureFormatter object and pass it the
// DSACryptoServiceProvider to transfer the private key.
DSASignatureFormatter DSAFormatter = new DSASignatureFormatter(DSA);
// Set the hash algorithm to the passed value.
DSAFormatter.SetHashAlgorithm(HashAlg);
// Create a signature for HashValue and return it.
sig = DSAFormatter.CreateSignature(HashToSign);
}
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
}
return sig;
}
public static bool DSAVerifyHash(byte[] HashValue, byte[] SignedHashValue,
DSAParameters DSAKeyInfo, string HashAlg)
{
bool verified = false;
try
{
// Create a new instance of DSACryptoServiceProvider.
using (DSACryptoServiceProvider DSA = new DSACryptoServiceProvider())
{
// Import the key information.
DSA.ImportParameters(DSAKeyInfo);
// Create an DSASignatureDeformatter object and pass it the
// DSACryptoServiceProvider to transfer the private key.
DSASignatureDeformatter DSADeformatter = new DSASignatureDeformatter(DSA);
// Set the hash algorithm to the passed value.
DSADeformatter.SetHashAlgorithm(HashAlg);
// Verify signature and return the result.
verified = DSADeformatter.VerifySignature(HashValue, SignedHashValue);
}
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
}
return verified;
}
}
最佳答案
如果您查看 DSA 的工作原理(例如 Wikipedia ),您会发现生成签名的第一步是选择一个随机值:
Generate a random per-message value k where 0 < k < q
稍后你会发现这种随机性是必要的:
With DSA, the entropy, secrecy, and uniqueness of the random signature value k is critical. It is so critical that violating any one of those three requirements can reveal the entire private key to an attacker. Using the same value twice (even while keeping k secret), using a predictable value, or leaking even a few bits of k in each of several signatures, is enough to break DSA.
随后提到了一个非常突出的破坏 ECDSA 的案例(它源自 DSA,但在椭圆曲线上工作)。
因此,您应该庆幸自己从未获得相同的签名。否则您的私钥将受到威胁。
关于c# - DSA 使用相同的数据生成不同的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20570625/
有没有办法在java中将DSA私钥转换为字符串或字节[]? 最佳答案 您调用 key 的 getEncoded() 方法。 相关: Save the Signature and the Public
这是设置: 我使用 .NET 创建公钥/私钥对,我想签署一个字符串。我获取一个随机字符串,从中获取一个 byte[],对其进行签名,然后在 java 应用程序中获取签名。我想在java中验证它((!)
如果我使用 Crypto++ 为 DSA 生成私钥和公钥: CryptoPP::AutoSeededRandomPool rng; CryptoPP::DSA::PrivateKey privateK
我正在使用 this MSDN article 中给出的示例关于 DSACryptoServiceProvider 类。问题是每次运行代码时我都会得到不同的签名。 我尝试了 OpenSSL 并没有遇到
我错过了什么吗?来自 FIPS180-2 ,在第 25 页,它给出了 u1、u2、g^u1 mod p、y^u2 mod p 和 v 的值。我已经计算了除 v 之外的所有值。但是,当我进行数学运算时,
当你执行 ssh-keygen -t ssh-dss 它生成两个文件:一个包含公钥,另一个包含私钥。 ssh-keygen man-page说它总是生成一个 1024 位 key ,但是当我打开公钥文
作为项目实现的一部分,我做了以下事情:1. 通用 DSA key 2.使用AES加密私钥3.保存到文件中4.打开文件并读取加密后的私钥5. 我尝试将读取的值转换为主键格式,但出现错误。我在这里附上上述
我正在尝试使用 DSA 证书签署一些数据。我将证书保存在内存中(它是使用 openssl gendsa 命令生成的)。 我的函数看起来像这样,我的问题是 res = EVP_SignFinal。这里函
有人可以让我放心,看看这个设置是否会验证文件是否来 self 。知道这有多安全以及任何潜在的攻击媒介会很棒。 使用 DSACryptoServiceProvider 创建公钥和私钥。 添加公钥作为应用
我在我的应用程序中使用 Sparkle 进行更新,但在文档中它说要生成 DSA 签名并提供一个工具来做(该工具是用 ruby 编码的)但我不知道如何使用它.有人可以帮忙吗? 这是文档所在的位置(第
我目前正在开发的共享软件注册系统将公共(public) DSA key 嵌入到可执行文件本身中,而私钥驻留在服务器上。 (为了讨论,我们假设服务器是 100% 安全的,任何人都无法获得私钥。) 每当购
看来它们都是需要公钥和私钥的加密算法。为什么我要选择其中之一来在我的客户端服务器应用程序中提供加密? 最佳答案 检查AVA's answer below . 我的旧答案似乎是错误的 关于encrypt
我收到了一个(非常)简单的 DSA 问题,并且已经找到了 key 和其他变量。为了验证签名,我需要以某种方式翻译方程: V = [(y^u1*h^u2)mod p] mod q 转换为 BigInte
有人知道 Python 中用于签名消息的纯 DSA 模块吗? 最佳答案 如果 OpenSSL 具有您正在寻找的功能,请尝试 pyOpenSSL . 关于python - Python 中的 DSA 模
我想使用 M2Crypto 创建一个 DSA_pub 对象来验证 DSA 签名。我知道 q、p、g 和公钥,但我知道实例化 DSA 对象的唯一方法是使用: dsa = DSA.set_params(q
我在使用 Python/M2Crypto 验证 DSA 签名时遇到问题。签名是在 Java 中生成的,使用标准的 java.security.Signature 类,带有 Sun 的加密提供程序和 S
在CentOS下有的时候用yum安装软件的时候最后会提示: 复制代码 代码如下: warning: rpmts_HdrFromFdno: Header V3
最小化安装后,安装rpm包时经常会遇到 复制代码 代码如下: warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKE
是否有人可以使用工具来区分 RSA 公钥和 DSA 公钥?我有两个 SSH .pub 文件,我需要知道它们是 RSA 还是 DSA。 最佳答案 正如其他答案中所述,由于文件是 SSH.COM 格式,您
假设我有一个如下所示的 DSA 公钥: -----BEGIN PUBLIC KEY----- MIIBuDCCASwGByqGSM44BAEwggEfAoGBAOwYAcAzXpuw+XCXuNp5z
我是一名优秀的程序员,十分优秀!