我需要在将请求发送到后端服务器之前对其进行签名.但是私钥是给我的.所以我需要导入它然后用它来签名.我可以导入和登录,但该数据与使用openssl签名时获得的数据不同.我知道它做错了,因为当我导入公钥时,我也无法验证它.如果有一种方法可以避免导入到钥匙串,那也会很棒. 几天来一直在努力工作,这对我们来说是一项很高的工作.请有人帮忙.
- (SecKeyRef) getPrivateKey {
//RSA KEY BELOW IS DUMMY.
key = @"-----BEGIN RSA PRIVATE KEY-----\nORtMei3ImKI2ZKI636I4+uNCwFfZv9pyJzXyfr1ZNo7iaiW7A0NjLxikNxrWpr/M\n6HD8B2j/CSjRPW3bhsgDXAx/AI1aSfJFxazjiTxx2Lk2Ke3jbhE=\n-----END RSA PRIVATE KEY-----\n";
NSString * tag = @"adpPrivateKey";
NSString *s_key = [NSString string];
NSArray *a_key = [key componentsSeparatedByString:@"\n"];
BOOL f_key = FALSE;
for (NSString *a_line in a_key) {
if ([a_line isEqualToString:@"-----BEGIN RSA PRIVATE KEY-----"]) {
f_key = TRUE;
}
else if ([a_line isEqualToString:@"-----END RSA PRIVATE KEY-----"]) {
f_key = FALSE;
}
else if (f_key) {
s_key = [s_key stringByAppendingString:a_line];
}
}
if (s_key.length …Run Code Online (Sandbox Code Playgroud) 我必须加密,存储然后解密大文件.这样做的最佳方式是什么?我听说RSA加密很昂贵,建议使用RSA加密AES密钥,然后使用AES密钥加密大文件.任何带有示例的建议都会很棒.
我想用Java生成一个RSA-SHA256签名,但我不能让它在控制台上生成与OpenSSL相同的签名.
这就是我对OpenSSL所做的事情(遵循本教程):
生成密钥对:
openssl genrsa -out private.pem 1024
Run Code Online (Sandbox Code Playgroud)
提取公钥:
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Run Code Online (Sandbox Code Playgroud)
创建数据哈希:
echo 'data to sign' > data.txt
openssl dgst -sha256 < data.txt > hash
Run Code Online (Sandbox Code Playgroud)
生成的哈希文件以(stdin)=我手工删除的内容开头(首先忘了提及它,谢谢马塔).
签名哈希:
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature
Run Code Online (Sandbox Code Playgroud)
要在Java中重现结果,我首先将私钥从PEM转换为DER:
openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -nocrypt > private.der
Run Code Online (Sandbox Code Playgroud)
现在我编写了这个Java类来生成相同的签名:
public class RSATest {
public static void main(String[] args) throws IOException,
NoSuchAlgorithmException, InvalidKeySpecException,
InvalidKeyException, SignatureException {
byte[] …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用KeyStore在应用程序中加密和解密用户名,
使用KeyPairGeneratorSpec在旧版本中创建密钥,如18到22,
KeyPairGeneratorSpec如被depricated android的M的23版本,但版本的Android M支持KeyGenParameterSpec.
此KeyGenParameterSpec是否支持向后兼容性或如何执行此操作?
我尝试了这样的事情,有没有更好的解决方案.现在工作正常!
在加密和解密的Ciper.getInstance时我需要这样做.是否有任何单个参数"RSA/ECB/OAEPWithSHA-256AndMGF1Padding"或"RSA/ECB/PKCS1Padding"我可以通过这两个版本?
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
}else{
c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
}
Run Code Online (Sandbox Code Playgroud)
下面的代码现在工作正常,让我知道如何改善这一点.
密钥生成器:
genkey(){
KeyPairGenerator generator = KeyPairGenerator .getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
TCLog.e(TAG,"Current version is 23(MashMello)");
//Api level 23
KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
keyName,
KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT )
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.build();
generator.initialize(spec);
}else{
TCLog.e(TAG,"Current version is < 23(MashMello)");
//api level 17+ 4.4.3
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getActivity())
.setAlias(keyName)
.setSubject(new X500Principal("CN=Sample Name, O=Android Authority"))
.setSerialNumber(BigInteger.ONE)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.build(); …Run Code Online (Sandbox Code Playgroud) [免责声明:我知道,如果你对加密有任何了解,你可能会告诉我为什么我做错了 - 我已经做了足够的谷歌搜索,知道这似乎是典型的反应.]
假设以下内容:您有一个中央权限,想要为给定域发出登录cookie.在此域上,您不一定信任所有人,但您有一些能够读取cookie的关键端点.我说了一些,但在实践中,这些"可信"的合作伙伴可能很大.Cookie不包含太多信息 - 用户名,时间戳,到期日,随机数.当然,出于性能原因,即使在加密后(在合理范围内),它仍应保持很小.现在,有两个安全问题:
1)我们不信任此域上的每个网络服务器都有用户数据.因此,读取cookie的能力应仅限于这些可信赖的合作伙伴.2)虽然我们相信这些合作伙伴能够保护我们用户的数据,但我们仍然希望权威的中心点是不可伪造的(同样在合理范围内).
现在,如果我们为权限生成私有RSA密钥并保密,并将公钥仅分发给"可信伙伴",我们应该能够使用私钥进行加密,并且任何拥有公钥的人都可以读取它. .我不清楚的是,是否仍然需要签署该消息,或者解密行为是否是使用私钥生成的证据?这种方案的优点还是比向所有相关方传播对称密钥并使用它加密更好或更差,而使用私钥只是为了签名?当然可以随意告诉我这是一个愚蠢的想法,但请记住,实际的论点可能比重塑爱丽丝和鲍勃更有说服力.
哦,并且实现指针是受欢迎的,尽管可以在Google上找到基础知识,如果有任何"陷阱"可能会有用!
我想知道如何在我的C源文件中使用OpenSSL库生成RSA私钥.我知道如何使用terminal命令生成它.
实际上我的server.c文件将生成一个私钥并发送到client.c请尽可能帮助我一些源代码,否则任何帮助将不胜感激.
我正在研究Linux机器.
我目前正在尝试使用C#生成并发送公共RSA密钥.它应该是PEM格式的2048位长密钥.我使用OpenSSL命令成功完成了以下操作(缩短了一些输出):
$ openssl genrsa 2048
Generating RSA private key, 2048 bit long modulus
............................................................+++
............................................................+++
e is 65537 (0x10001)
$ openssl rsa -pubout
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAy1MoBtENHBhYLgwP5Hw/xRGaBPHonApChBPBYD6fiq/QoLXA
RmyMoOjXHsKrrwysYIujXADM2LZ0MlFvPbBulvciWnZwp9CUQPwsZ8xnmBWlHyru
xTxNSvV+E/6+2gMOn3I4bmOSIaLx2Y7nCuaenREvD7Mn0vgFnP7yaN8/9va4q8Lo
...
...
y5jiKQKBgGAe9DlkYvR6Edr/gzd6HaF4btQZf6idGdmsYRYc2EMHdRM2NVqlvyLc
MR6rYEuViqLN5XWK6ITOlTPrgAuU6Rl4ZpRlS1ZrfjiUS6dzD/jtJJvsYByC7ZoU
NxIzB0r1hj0TIoedu6NqfRyJ6Fx09U5W81xx77T1EBSg4OCH7eyl
-----END RSA PRIVATE KEY-----
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy1MoBtENHBhYLgwP5Hw/
xRGaBPHonApChBPBYD6fiq/QoLXARmyMoOjXHsKrrwysYIujXADM2LZ0MlFvPbBu
lvciWnZwp9CUQPwsZ8xnmBWlHyruxTxNSvV+E/6+2gMOn3I4bmOSIaLx2Y7nCuae
nREvD7Mn0vgFnP7yaN8/9va4q8LoMKlceE5fSYl2QIfC5ZxUtkblbycEWZHLVOkv
+4Iz0ibD8KGo0PaiZl0jmn9yYXFy747xmwVun+Z4czO8Nu+OOVxsQF4hu1pKvTUx
9yHH/vk5Wr0I09VFyt3BT/RkecJbAAWB9/e572T+hhmmJ08wCs29oFa2Cdik9yyE
2QIDAQAB
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
以下代码是我用来使用C#生成公钥的代码:
// Variables
CspParameters cspParams = null;
RSACryptoServiceProvider rsaProvider = null;
StreamWriter publicKeyFile = null;
string publicKey = "";
try
{
// Create a new …Run Code Online (Sandbox Code Playgroud) 我使用RSA算法进行加密/解密,为了解密文件,你必须处理一些非常大的值.更具体地说,像
P = C^d % n
= 62^65 % 133
Run Code Online (Sandbox Code Playgroud)
现在这真的是唯一不适当的计算.我尝试过使用Matt McCutchen的BigInteger库,但是在链接过程中我遇到了很多编译错误,例如:
encryption.o(.text+0x187):encryption.cpp: undefined reference to `BigInteger::BigInteger(int)'
encryption.o(.text+0x302):encryption.cpp: undefined reference to `operator<<(std::ostream&, BigInteger const&)'
encryption.o(.text$_ZNK10BigIntegermlERKS_[BigInteger::operator*(BigInteger const&) const]+0x63):encryption.cpp: undefined reference to `BigInteger::multiply(BigInteger const&, BigInteger const&)'
Run Code Online (Sandbox Code Playgroud)
所以我想知道处理RSA算法产生的真正大整数的最佳方法是什么.
我听说有可能将你的变量声明为双倍长,所以......
long long decryptedCharacter;
Run Code Online (Sandbox Code Playgroud)
但我不确定可以存储多大的整数.
好吧,例如,我尝试使用dev C++编译并运行以下程序:
#include iostream
#include "bigint\BigIntegerLibrary.hh"
using namespace std;
int main()
{
BigInteger a = 65536;
cout << (a * a * a * a * a * a * a * a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我得到了那些错误.
Derek,我认为通过包含BigIntegerLibrary.hh文件,编译器会经历并编译它将使用的所有必要文件. …
在我的c#应用程序中,我正在使用RSA签名文件,然后由上传的人上传到我公司的数据库中,在这里我必须选择SHA-1或SHA-2来计算哈希值.
与编程中的任何其他组件一样,我知道必须有一个"在这里使用"和"在那里使用"这两个组件.
那么,什么时候?那时呢?
编辑:
我的问题是:性能有什么不同?而不是关于安全性,因为我已经知道SHA-2比SHA-1更安全.
在此链接中,不同类型的SHA-2之间的比较注意何时使用SHA-512以及何时不使用SHA-512.我需要一个关于SHA-1和SHA-2的类似论点.
我需要在Python中使用RSA加密和解密的帮助.
我正在创建一个私钥/公钥对,用密钥加密消息并将消息写入文件.然后我正在从文件中读取密文并使用密钥解密文本.
我在解密部分遇到问题.正如您在下面的代码中所看到的,当我输入decrypted = key.decrypt(message)该程序时,解密的消息再次加密.好像它不是从文件中读取密文.
任何人都可以帮我写这段代码,所以解密从文件中读取密文,然后使用密钥解密密文?
import Crypto
from Crypto.PublicKey import RSA
from Crypto import Random
random_generator = Random.new().read
key = RSA.generate(1024, random_generator) #generate public and private keys
publickey = key.publickey # pub key export for exchange
encrypted = publickey.encrypt('encrypt this message', 32)
#message to encrypt is in the above line 'encrypt this message'
print 'encrypted message:', encrypted #ciphertext
f = open ('encryption.txt', 'w'w)
f.write(str(encrypted)) #write ciphertext to file
f.close()
#decrypted code below
f = open ('encryption.txt', 'r') …Run Code Online (Sandbox Code Playgroud)