Tag: 密码学

在C#中生成随机盐的最佳方法?

问题就是这样,在C#中生成随机盐(与哈希函数一起使用)的最佳方法是什么?

C#中的非对称加密示例

我需要通过TCP连接将机密数据发送到服务器。 我做了很多研究,理解了理论部分。 根据我研究的内容,我想做以下事情: 注意有一个服务器和一个客户端:(我们假设任何人都可以获得客户端或服务器的公钥) 客户端创建他的公钥和私钥。 他能够使用他的私钥加密并使用他的公钥解密。 服务器创建他的公钥和私钥。 私钥用于解密消息,公钥用于加密消息。 (注意与客户端相反) 客户端获取服务器的公钥。 然后,客户端将能够使用该密钥加密消息,并且唯一能够解密该消息的消息将是服务器的私钥。 由于服务器需要确定消息来自该特定客户端,因此客户端将使用其私钥加密其名称(签名)。 因此客户端消息将包含:要发送的数据,客户端的公钥,使用客户端私钥加密的客户端名称。 客户端将使用来自服务器的公钥加密消息。 然后,客户端将该消息发送到服务器。 服务器将使用他的私钥解密刚刚收到的消息。 一旦消息被解密,它将包含来自客户端的数据(信息),加密签名,公钥。 最后,服务器将使用消息中包含的公钥解密客户端签名,以validation消息是否来自该客户端。 好的,这就是非对称加密的工作原理。 我还研究过使用.NET框架创建密钥对的类。 我研究过的可以创建这个公钥和私钥对的类是: System.Security.Cryptography.DES System.Security.Cryptography.DSACryptoServiceProvider System.Security.Cryptography.ECDsa System.Security.Cryptography.ECDsaCng System.Security.Cryptography.ECDiffieHellman System.Security.Cryptography.ECDiffieHellmanCng System.Security.Cryptography.RSA System.Security.Cryptography.RSACryptoServiceProvider 所以现在我的问题出现在如何使用其中一个类来使用C#来实现它? 我理解理论部分是如何工作的,但我怎么做我刚才用代码描述的东西。 我已经研究了一些例子,但我很难理解它们。 这是一个例子,我发现我相信我所描述的: using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Example { class Program { static CngKey aliceKey; static CngKey bobKey; static byte[] […]

如何使用FromBase64String 创建长度为16的byte

我需要创建一个长度为16的byte[] 。(一个字节数组,有128位用作AES加密中的Key)。 以下是有效的字符串 “AAECAwQFBgcICQoLDA0ODw==” 确定字符串是否为128位的算法是什么? 或者是反复试验是创建这种128位字符串的唯一方法吗? 码 static void Main(string[] args) { string firstString = “AAECAwQFBgcICQoLDA0ODw==”; //String Length = 24 string secondString = “ABCDEFGHIJKLMNOPQRSTUVWX”; //String Length = 24 int test = secondString.Length; byte[] firstByteArray = Convert.FromBase64String((firstString)); byte[] secondByteArray = Convert.FromBase64String((secondString)); int firstLength = firstByteArray.Length; int secondLength = secondByteArray.Length; Console.WriteLine(“First Length: ” + firstLength.ToString()); Console.WriteLine(“Second Length: […]

如何使用’System.Security.Cryptography.AesManaged’来加密字节?

基本上我想使用System.Security.Cryptography.AesManaged(或者更好的类,如果你认为有一个?)来获取一个字节数组并使用给定的对称密钥创建另一个加密的字节数组(我假设我需要一?)。 我还需要改变这个程序的方法。 关键是我可以加密存储的密码。 我假设有一种简单的方法可以做到这一点? 谢谢

使用RSA公钥解密使用RSA私钥加密的字符串

我知道我可能会得到的主要答案是你为什么要这么做?! 不幸的是,尽管我有抗议,但我必须这样做,尽管我知道它没什么意义。 我有.Net编写的函数使用私钥解密,使用公钥加密。 我也签署并validation并对我认为这一切的工作方式有一个合理的理解。 我现在被发送一个使用私钥进行RSA加密的值,我应该通过使用公钥解密来获得可用值。 我似乎无法弄清楚如何做到这一点。 我是个白痴吗? 这是正常的事吗? 发送给我的人告诉我这在PHP中没问题。 我不知道,还没有使用过PHP。 我找不到一个库,用我所知的任何主要语言,即C ++,Java,C#。 我正在使用的服务器使用.Net。 我希望有人可以帮助我。 如果除了乞求他们改变他们正在做的事情之外还有某种合理的解决方案,那将是很棒的。 这是我的方法(根据Iridium指出的我之前的错误更新)但是当我尝试解密该值时,我得到了一个exception “解码OAEP填充时出错。” 如果我使用rsa.Decrypt(bytes,false),我会得到一个错误的密钥exception。 public static string DecryptUsingPublic(string dataEncrypted, string publicKey) { if (dataEncrypted == null) throw new ArgumentNullException(“dataEncrypted”); if (publicKey == null) throw new ArgumentNullException(“publicKey”); try { RSAParameters _publicKey = LoadRsaPublicKey(publicKey, false); RSACryptoServiceProvider rsa = InitRSAProvider(_publicKey); byte[] bytes = Convert.FromBase64String(dataEncrypted); […]

如何在.NET中加密字符串?

我必须加密/解密Xml文件中的一些敏感信息? 是的我可以通过编写自己的自定义算法来做到这一点。 我想知道在.NET中是否已经有一种内置方式可以做到这一点以及我总是需要注意哪些方面……

在C#中解密PKCS#7加密数据

我正在研究一种需要解密PKCS#7加密数据的解决方案,最好是在C#中。 据我所知,.NET api通过System.Security.Cryptography.Pkcs命名空间支持这一点。 但是,似乎实现只能在字节数组上工作。 那么当我有一个不适合内存的大型加密文件时,我该怎么办? 我在这里遗漏了什么,或者是否有另一种方法在Stream级别上执行此操作而不是使用bytearrays?

查询字符串参数混淆

我想在ASP.NET中混淆一个查询字符串参数。 该站点将有大量请求,因此算法不应该太慢。 我的问题是我发现的所有算法都会产生不需要的字符(比如+ / =) 这是我想要实现的一个例子: www.domain.com/?id=1844 至 www.domain.com/?id=3GQ5DTL3oVd91WsGj74gcQ 混淆的参数应该只包括az和AZ以及0-9个字符。 我知道我可以使用base64加密,但这会生成不需要的字符,如/或=或+ 。 知道可以使用什么算法吗? 更新:我知道UrlEncoding,我想避免编码字符串。 因为这会在url中生成%F2或%B2等字符。

对称加密(AES):保存IV和Salt以及加密数据是否安全且正确?

在使用对称加密算法(在本例中为AES)加密和解密数据时,我试图理解如何处理和管理启动向量和盐(适用时)。 我从不同的SO线程和各种其他网站推断出,IV或盐都不需要保密,只是为了防御密码分析攻击,例如蛮力攻击。 考虑到这一点,我认为将伪随机IV与加密数据一起存储是可行的。 我问的是我使用的方法是否合适,而且,我是否应该以同样的方式处理我当前的硬编码盐? 那就是将它写在IV旁边的内存流中 我的代码: private const ushort ITERATIONS = 300; private static readonly byte[] SALT = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c }; private static byte[] CreateKey(string password, int keySize) { DeriveBytes derivedKey = new Rfc2898DeriveBytes(password, SALT, ITERATIONS); return derivedKey.GetBytes(keySize […]

使用AesCryptoServiceProvider获取不正确的解密值

我有以下代码使用AesCryptoServiceProvider进行加密和解密。 加密和解密使用的iv和key相同。 解密值仍然与源字符串不同。 解密后需要更正才能获得原始值? 当inputValue = valid128BitString时,此代码正在运行。 但是当inputString = “Test”我得到以下exception, Padding is invalid and cannot be removed. 。 我们怎样才能纠正它? 更新的问题 以下将根据@jbtule答案进行操作。 encyptedValue.IV = result.IV; 加密结果的IV值发生变化。 假设加密是在一个单独的过程中完成的,我们怎么知道IV用于解密? 有没有办法让它保持不变或已知? 答:您的另一个选择是通过IV进入加密并在开始加密转换之前分配它,而不是让aesProvider为您生成随机的。 – @Scott Chamberlain aesProvider.IV = Convert.FromBase64String(“4uy34C9sqOC9rbV4GD8jrA==”); 更新:请参阅如何为Base64应用填充 。 我们可以使用UTF8来编码源输入和结果输出。 密钥和IV可以保留在Base64 。 使用Base64进行源输入会导致某些值出现问题,例如“MyTest”,其中字符串的长度不是4的倍数 相关要点: 要解密使用其中一个SymmetricAlgorithm类加密的数据,必须将Key属性和IV属性设置为用于加密的相同值。 SymmetricAlgorithm.IV属性:来自前一个块的信息被混合到加密下一个块的过程中。 因此,两个相同的纯文本块的输出是不同的。 因为该技术使用前一个块来加密下一个块,所以需要初始化向量来加密第一个数据块。 (根据SymmetricAlgorithm.IV属性 MSDN文章) 有效密钥大小为:128,192,256位(根据我的AES方法为字节数组创建多少个字符? ) 主体计划 class Program { static void […]