Tag: 密码学

从密码字符串派生加密密钥和IV时,可以使用密码的SHA1哈希作为盐吗?

我正在使用Rfc2898DeriveBytes从用户提供的字符串密码安全地生成加密密钥和初始化向量,以便与对称加密一起使用(例如AesManaged)。 我将密码的SHA1哈希作为盐参数提供给Rfc2898DeriveBytes 。 这可以吗? 如果没有,那么我应该从哪里获取盐? 解密时我需要相同的盐,对吧? 所以我必须将它存储在未加密的地方 – 不安全。 如果我必须安全地存储它,那么它只是成为另一个“密码”,不是吗? void SecureDeriveKeyAndIvFromPassword(string password, int iterations, int keySize, int ivSize, out byte[] key, out byte[] iv) { // Generate the salt from password: byte[] salt = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(password)); // Derive key and IV bytes from password: Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, salt, iterations); key = derivedBytes.GetBytes(keySize); […]

对于AES算法名称,CryptDeriveKey失败

我正在尝试在我的应用程序中实现AES加密。 我有以下代码来创建用户密码的哈希版本。 PasswordDeriveBytes passwdHash = new PasswordDeriveBytes( password, salt, “SHA1”, 128 ); byte[] keyBytes = passwdHash.CryptDeriveKey( “AES”, “SHA1”, 192, iv ); 第二行抛出System.Security.Cryptography.CryptographicException ,错误消息Object identifier (OID) is unknown 。 我使用Reflectorvalidation错误是否被抛出,因为CryptDeriveKey()不喜欢“AES”算法名称(我使用AesCryptoServiceProvider()来执行加密)。 我尝试将名称更改为“AESManaged”,“AES192”和“Rijndael”,但它们都抛出相同的exception。 我如何让它工作? 或者是否有另一种导出关键字节的方法? 另外,是否有关于允许的算法名称字符串是什么的文档? 我在MSDN文档中找不到该function的任何内容。 我正在使用Visual Studio 2008并以.NET Framework 3.5为目标 在此先感谢您的帮助!

C#BouncyCastle – 使用公钥/私钥进行RSA加密

我需要在C#中加密数据,以便将其传递给Java。 Java代码属于第三方但我得到了相关的源代码,因此我决定,当Java使用Bouncy Castle库时,我将使用C#端口。 解密工作正常。 但是,只有当我使用私钥加密而不使用公钥时,解密才有效。 使用公钥时,解密会因unknown block type失败。 显然, RsaEncryptWithPrivate的加密在加密时使用公钥,所以我不明白为什么这两种加密方法在function上不相同: using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.OpenSsl; public class EncryptionClass { public string RsaEncryptWithPublic(string clearText , string publicKey) { var bytesToEncrypt = Encoding.UTF8.GetBytes(clearText); var encryptEngine = new Pkcs1Encoding(new RsaEngine()); using (var txtreader = new StringReader(publicKey)) { var keyParameter = (AsymmetricKeyParameter)new PemReader(txtreader).ReadObject(); encryptEngine.Init(true, keyParameter); } […]

为什么我收到“指定的无效算法”exception

这是我的代码。 X509Certificate pXCert = new X509Certificate2(@”keyStore.p12″, “password”); RSACryptoServiceProvider csp = (RSACryptoServiceProvider)pXCert.PrivateKey; string id = CryptoConfig.MapNameToOID(“SHA256”); return csp.SignData(File.ReadAllBytes(filePath), id); 在最后一行,我得到了例外: System.Security.Cryptography.CryptographicException“指定的算法无效。” 我究竟做错了什么? 更新: id = 2.16.840.1.101.3.4.2.1

“坏数据”CryptographicException

首先,我只是为了学术目的而编写了以下代码。 我说这个的原因是因为我没有将它放在生产环境中,因此我“绕过”了我需要做的一些开销,我只需要能够使用加密/解密字符串下面的代码。 我能够做到这一点,但由于某种原因,我开始收到“CryptographicException Bad Data”,并且不确定是什么原因造成了这个问题。 private string RSAEncrypt(string value) { byte[] encryptedData = Encoding.Unicode.GetBytes(value); CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = _rsaContainerName; using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams)) { encryptedData = RSA.Encrypt(encryptedData, false); return Convert.ToBase64String(encryptedData); } } private string RSADecrypt(string value) { byte[] encryptedData = Encoding.Unicode.GetBytes(value); CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = _rsaContainerName; using […]

C#WPF加密

我想使用C#WPF加密密码。 什么是最好的算法(并且易于实现)? 我想要一些关于如何使用它的例子……

使用AES和rsaEncryption(PKCS#1 v1.5填充而不是v2(OAEP)填充)的EnvelopedCMS可能吗?

我一直在使用.NET进行加密。 到目前为止,我将3DES(Oid 1.2.840.113549.3.7)与rsaEncryption(Oid 1.2.840.113549.1.1.1,RSAES-PKCS1-v1_5)结合使用。 虽然第一个现在已被AES取代(Oid 2.16.840.1.101.3.4.1.42),但我仍然必须使用rsaEncryption / RSAES-PKCS1-v1_5 ,而不是RSAES-OAEP 。 如果我只是将另一个参数传递给我正在调用的EnvelopedCMS构造函数,我可以从3DES切换到AES: ContentInfo plainContent = new ContentInfo(new Oid(“1.2.840.113549.1.7.1”), data); EnvelopedCms encryptedMessage = new EnvelopedCms(plainContent); // using 3DES // EnvelopedCms encryptedMessage = new EnvelopedCms(plainContent, new AlgorithmIdentifier(new Oid(“2.16.840.1.101.3.4.1.42”))); // for AES (id-aes256-CBC) CmsRecipient recipient = new CmsRecipient(cert); encryptedMessage.Encrypt(recipient); byte[] encryptedBytes = encryptedMessage.Encode(); 到目前为止这很好。 不幸的是,有些收件人无法解密我的邮件,尽管他们能够解密AES。 查看ASN.1结构告诉我,不仅3DES改为AES,而且rsaEncryption(1.2.840.113549.1.1.1)被RSAES-OAEP (1.2.840.113549.1.1.7)取代。 我可以以某种方式强迫仍然使用EnvelopedCMS的RSAES-PKCS1-v1_5吗? 或者您是否在切换3DES-> […]

RandomNumberGenerator与RNGCryptoServiceProvider

根据RandomNumberGenerator的 MSDN文档: 应用程序代码不直接使用此类。 此抽象类作为所有加密随机数生成器的基类提供。 对于加密随机数生成器的实现,请使用派生类RNGCryptoServiceProvider。 但是,我在不同代码库中的几个场景中看到了以下代码: byte[] bytes = new byte[…]; RandomNumberGenerator rng = RandomNumberGenerator.Create(); rng.GetBytes(bytes); 最值得注意的是StackExchange (我假设包含SO)以及BCrypt.Net 。 因此,我有点困惑 – 上面代码返回的是什么类型的RandomNumberGenerator ? 一些代码库使用RNGCryptoServiceProvider而不是RNGCryptoServiceProvider也是一个缺陷吗? 我假设RandomNumberGenerator.Create()正在我的工作中完成,我在这里完全没有,但从技术上讲(因为它是一个抽象类)上面的代码不应该抛出错误吗?

将数据放入cookie中是否安全?

我正在使用asp.net mvc 2.0,我想知道将信息放入cookie有多安全? 就像我在我的cookie中放入一个加密的表单身份validation票据,这样我可以将那些可能敏感的信息放在那里吗? string encryptedTicket = FormsAuthentication.Encrypt(authTicket) HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 就像我没有存储密码或类似的东西,但我想存储UserId,因为目前每次用户向我的网站发出请求时,我必须进行查询并获取用户Userid,因为我的数据库中的每个表都需要你使用userId获取正确的行。 所以这些开始快速加起来所以我宁愿拥有它,如果用户被认证一次,那就是它,直到他们需要再次重新认证。 如果我将存储此userId,我可以将如此多的请求保存到数据库。 然而,我不希望它以明文forms出现,因为潜在的人可能会使用它来尝试从数据库中获取一行,而实际上它们不应该存在。 显示身份validation使用的加密有多好?

密码学.NET,避免时间攻击

我正在浏览crackstation.net网站并遇到这个代码,其评论如下: 在长度 – 恒定时间内比较两个字节数组。 使用此比较方法,以便无法使用定时攻击从在线系统中提取密码哈希值,然后离线攻击。 private static bool SlowEquals(byte[] a, byte[] b) { uint diff = (uint)a.Length ^ (uint)b.Length; for (int i = 0; i < a.Length && i < b.Length; i++) diff |= (uint)(a[i] ^ b[i]); return diff == 0; } 任何人都可以解释一下这个函数实际是如何工作的,为什么我们需要将长度转换为无符号整数以及这种方法如何避免定时攻击? 行diff |= (uint)(a[i] ^ b[i]); 做?