我需要加密双向(对称)不同的令牌。这些令牌预计会重复(例如,它们是人的名字),但我不希望攻击者断定哪些加密令牌来自相同的原始令牌。Salt 是单向加密(散列)的一种方法。
是否有一种可以在对称加密中工作的方法、解决方法或替代方案?
我正在浏览libsodium,特别是对称加密选项XChaCha20-Poly1305。我无法理解的是,libsodium似乎没有提供加密库中常见的“上下文/更新/最终确定”工作方式。
从libsodium中可以清楚地看出,XChaCha20-Poly1305 消息的大小“没有实际限制”。但是实际上,如果我要加密一个多 GB 的文件,我不太清楚您将如何使用 libsodium ?因为显然您只会将fread缓冲区的内容传递给crypto_aead_xchacha20poly1305_ietf_encrypt?
给那些认为这不是主题的人的重要提示
在屈服于同辈压力之后,我确实删除了这篇文章。但是,我应@MaartenBodewes 的要求重新打开了它,他强烈认为这是切入主题,并且非常强烈以至于他付出了一些努力来撰写答案。因此,出于对他努力的尊重,我取消了该帖子。请给我更多的“离题”评论,我已经阅读了足够多的评论!
一对 Amazon Lambda 将对称地加密和解密一小段应用程序数据。我想使用 Amazon KMS 来促进这一点,因为它解决了秘密存储和密钥轮换等问题。
Amazon KMS 开发人员指南指出:
这些操作旨在加密和解密数据密钥。他们在加密操作中使用 AWS KMS 客户主密钥 (CMK),并且不能接受超过 4 KB(4096 字节)的数据。尽管您可以使用它们来加密少量数据(例如密码或 RSA 密钥),但它们并不是为加密应用程序数据而设计的。
它还建议使用AWS 加密 SDK或Amazon S3 加密客户端来加密应用程序数据。
虽然AWS 加密 SDK 所列出的优势显而易见,并且非常有吸引力,尤其是对于非密码学家的开发人员而言,但出于本问题的目的,我们假设环境不利于这些替代方案。
如果我的应用程序数据肯定不会超过 4k,为什么我不应该简单地使用 Amazon KMS 来加密和解密这些数据?
使用案例
我的团队正在实施一个新的身份验证层,以便在我们公司的服务和 API 中使用。我们正在实施 JWT 规范,但虽然我们打算避开广泛记录的困扰 JWE / JWS 兼容令牌签名的加密不满,但我们正在对有效负载进行对称加密。因此,我们保留了非加密令牌验证操作(过期等)的标准库实现的优势,并且留下了加密“脚枪”。
这是一个非常常见的异常,但显然我找到的解决方案都没有解决我的问题。
我有一个加密和一个解密方法;我加密一个字符串并将其写入文件,然后从文件中读取该字符串并解密(理论上)。事实上,我得到了一个
CryptographicException:要解密的数据长度无效
在该过程的解密方面。
这是Main()完成所有工作的方法:
public static void Main()
{
var filename = "test.encrypted";
var plainText = "Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
string password = "A better password than this";
string salt = "Sodium Chloride";
var padding = PaddingMode.Zeros; // I have tried every padding mode to no avail
var encrypted = Encrypt<AesManaged>(plainText, password, salt, padding);
File.WriteAllBytes(filename, encrypted);
var fileBytes = File.ReadAllBytes(filename);
var decrypted = Decrypt<AesManaged>(fileBytes, password, salt, padding);
Console.ReadLine(); …Run Code Online (Sandbox Code Playgroud) 我正在开发一个客户端服务器应用程序,它使用ssl(openssl)在客户端和服务器之间建立安全的通信通道.我相信我现在有两种方法可以在客户端和服务器之间进行安全的数据传输.一种选择是继续在客户端和服务器之间建立的安全ssl信道上进行数据传输,即使加密/解密过程因使用非对称密钥而变慢.另一种选择是在ssl通道上传输对称密钥,并在对称密钥传递到客户端后关闭ssl通道.此后的通信将使用对称密钥在常规TCP通道上进行,我相信这将比使用非对称密钥快得多.这种方法有什么缺点吗?对称密钥方法显而易见的一件事是密钥管理过程,我想通过不将密钥存储在客户端来处理.对称密钥将在通过SSL通道启动时传送到客户端.密钥根本不会存储在客户端中.有什么想法吗?
我的软件使用的是AES Rijndael.
我使用SHA-256哈希从具有任意长度的字符串生成密钥,然后将其作为私钥和公钥传递,因为在这种情况下我不需要区分这两者.
如何保护我的密钥不被可执行文件侵入?
我知道不要使用文字,而是在运行时使用一些预定的步骤生成密钥,但是所有相同的密钥在发送到AES初始化函数之前仍然在内存中,因此可以非常容易地检索.
AES显然非常安全,但是如果有人打破了可执行文件,那对我有什么好处?
解决这个问题时有一些常见的做法吗?
我正在尝试使用 AES 进行加密/解密,然后我尝试了 CBC 和 ECB 模式,我从所有三个模式中都获得了相同的加密输出!这是怎么回事?
这可能没有错,但我只是不知道会发生什么。如果它们都产生相同的密码,那么拥有模式有什么意义?是时间复杂度还是性能复杂度?
你能解释一下 AES 和它的密码模式之间的区别吗?什么是默认密码模式?或者如果你能给我任何参考,因为 MSDN 不够清楚
谢谢你
c# encryption cryptography encryption-symmetric aescryptoserviceprovider
我有一个用于 RSA 交换的私钥,该私钥受密码保护。我知道密码,所以我可以使用密钥,但是,我不知道使用哪个密码来设置密码。
我还有其他密钥,其中密码在解密密钥的标头中命名,根据此问题的答案。然而,这个密钥在加密时只是简单地开始:
-----BEGIN ENCRYPTED PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
解密后:
-----BEGIN RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
没有进一步的标题。
诸如openssl rsa和 gnutls 之类的工具certtool -k会在给出密码时解密密钥,并提供有关公钥的信息,但不会透露有关密码所使用的对称密码的任何信息。
据推测,这些应用程序知道密码是什么,因为它们解密了密钥。有没有办法获取这些信息?无论如何,如果我有密码,保密似乎没有多大意义。
使用 gnutls API(但不是 openssl)的编程答案很好,但理想情况下我想知道现有的便携式工具。
我知道尝试实现自己的加密算法是个坏主意.这是我认为不是的一个原因:
例如,假设我想发送plainText = new byte[]{2,5,1,6,7}给bob.
如果我使用AES加密或其他熟知的算法,那么我将:
cipherText = Aes.Encrypt(plainText, key, iv); // now I have some cipher text that is not readable to anyone if they do not have the key and iv vector.
Run Code Online (Sandbox Code Playgroud)
如果有人想要解密该消息,那么他们将不得不做以下事情:
newPlainText = Aes.Decrypt(cipherText, key, iv);
Run Code Online (Sandbox Code Playgroud)
现在我的问题是AES如何知道你是否输入了正确的密钥?我认为使用一种不会出现暴力攻击的算法会更安全.换句话说,如果黑客知道你使用了AES,它可以继续尝试很多密码,直到method Aes.DecryptThorw也不例外.现在考虑这个算法:
假设我想将相同的字节数组发送{2,5,1,6,7}到bob.我的加密算法可能如下所示:
password is ="securePassword";
我将迭代我的纯文本上的每个字节,并对密码上每个字符的ASCII值执行Xor运算符.例如,第一个字节将是2 Xor (ASCII value of 's')下一个值将5 Xor (ASCII value of 'e')结束我将结束{2 Xor 's', 5 Xor 'e', 1 Xor 'c', 6 Xor 'u', …
我使用相同的密码和盐,但每次运行PasswordDerivedBytes时它都会生成不同的密钥.但是,如果我使用Sha1,它每次都会产生相同的密钥.这是为什么?
如果我使用相同的密码,salt,initvector组合,知道它使用HMACSha1,为什么Rfc2898DerivedBytes每次产生相同的密钥?
以下代码摘要 -
string passPhrase = "passPhrase";
byte[] saltBytes = Encoding.ASCII.GetBytes("saltValue");
int iterations = 2;
int keySize = 32;
string hashAlgo = "HMACSHA1";
Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(passPhrase, saltBytes, iterations);
byte[] keyBytes = derivedBytes.GetBytes(keySize);
PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, saltBytes, hashAlgo, iterations);
byte[] keyBytes2 = password.GetBytes(keySize);
Run Code Online (Sandbox Code Playgroud) encryption ×7
c# ×3
cryptography ×3
security ×2
.net-3.5 ×1
aes ×1
amazon-kms ×1
aws-lambda ×1
c ×1
gnutls ×1
openssl ×1
private-key ×1
rijndael ×1
rsa ×1
salt ×1
ssl ×1