我需要实现AES 256加密/解密,我无法找到一个正常工作的示例.
MSDN建议我应该使用AES类.
Rijndael类是Aes算法的前身.您应该使用Aes算法而不是Rijndael.有关更多信息,请参阅.NET安全博客中的Rijndael和AES之间的条目.
有没有人能指出我使用AES类AES256的好例子?
为了增加一点清晰度:
我有一个密码文件,其中包含共享密钥和一串加密文本.我需要解密文本然后验证它.
我见过的所有示例都希望至少有2个参数来执行加密/解密.
我是否能够从密码文件中的文本推断出初始化向量和密钥?
这是我的密码文件中保存的文本示例:
ÊÚḱÌráƒ@†²;Ä;öDWnªóª©¨¨L
我目前正在AES/CBC/PKCS5Padding
用于加密具有256字节密钥大小的Java文件,但在搜索时我在stackexchange PKCS#5-PKCS#7 Padding上找到了它,并且提到了,
PKCS#5填充是PKCS#7填充的子集,用于8字节块大小
所以我想知道
AES/CBC/PKCS7Padding
会更好AES/CBC/PKCS5Padding
吗?PKCS#7填充适用于1到255字节的任何块大小.
我的示例代码是,
SecureRandom rnd = new SecureRandom();
IvParameterSpec iv = new IvParameterSpec(rnd.generateSeed(16));
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(256);
SecretKey k = generator.generateKey();
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, k, iv);
Run Code Online (Sandbox Code Playgroud) 我正在寻找创建一个使用与OpenSSL兼容的.NET库的类.我知道有一个OpenSSL.Net包装器,但我宁愿避免引用第三方\非托管代码.我不是在寻找关于这是否是正确选择的讨论,但有理由.
目前我有以下内容,我认为应该与OpenSSL兼容 - 它有效地做了我认为OpenSSL从OpenSSL文档中所做的事情.但是,即使只使用这个类来进行加密和解密,我也会收到以下错误:
[CryptographicException] Padding is invalid and cannot be removed.
Run Code Online (Sandbox Code Playgroud)
我已经逐步完成了代码并验证了salt\key\iv在加密和解密过程中都是一样的.
请参阅下面的示例类和调用加密解密.欢迎任何想法或指示.
public class Protection
{
public string OpenSSLEncrypt(string plainText, string passphrase)
{
// generate salt
byte[] key, iv;
byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetNonZeroBytes(salt);
DeriveKeyAndIV(passphrase, salt, out key, out iv);
// encrypt bytes
byte[] encryptedBytes = EncryptStringToBytesAes(plainText, key, iv);
// add salt as first 8 bytes
byte[] encryptedBytesWithSalt = new byte[salt.Length + encryptedBytes.Length];
Buffer.BlockCopy(salt, 0, encryptedBytesWithSalt, 0, salt.Length);
Buffer.BlockCopy(encryptedBytes, 0, encryptedBytesWithSalt, salt.Length, …
Run Code Online (Sandbox Code Playgroud) 我能用Ruby解密AES加密消息,如下所示:
require 'openssl'
require 'base64'
data = "IYkyGxYaNgHpnZWgwILMalVFmLWFgTCHCZL9263NOcfSo5lBjAzOZAtF5bF++R0Bi+9c9E+p3VEr/xvj4oABtRWVJ2wlWzLbYC2rKFk5iapFhb7uZCUpO4w4Su3a5QFa2vInjYueziRoqySZd/DpstMJ8rsJ94VGizFFFZ1l0sw1ax+wfBAv5+wHs/hlnHi/ea66KBO3rgXKahvV28h+4bh5etc8RCrmiiNbfg6Oj0jQJDjdYIdW8T9YPOI9E1hih8lbfRnMWcOFJgYekfLpoy5LI525UGnlM46J1k6ekLqsn9FqvbiOOoLgqa4YqBm1i9P0ePyjkME+t+RiL8xXX+ItgOYr9G7kM64wlTJPCW8B/crmUdmGzQNC/hD/u/8wfHBS2f8u6OtQMG/+Kpk1oju8lcUZGI/4S8A6/OuktvQr2zgnbs2aADMrM37Oait/pJ3G73S7NwVT8EaK+X43c0C/fUvW2/bD/rqCNpAh9WQlz4Cj6JHwjbmwuind6aCimF1tHjXuR9FXu+g17sPT4ZkKZ6aeBG+m170XdCGn2hVM0wH1rh3VeCG2u/JFqfuGKGSoqeHeNY/icu9pEhtZDzHd7aPoaMXcWvXC9PjooBf7GM1EPacSdnon1kBobjtKSt1l15DjO5TMrJoX7VO7GotQwo+uI/u5Kop01hBXxyxyggl1/8N0ESohPJoqLDrIwvbGK5kW4B49FVPnx9CMvjZDdSsoxPAh+hx6SPe8Hj0Nx4bRs06cbtOkte/V8QSYIqjiJDleEqPrdiKlvgToZz9L29ZR/3Ln65qU1sq7q9c0SEYxIopV7TdTjFS7y76zDPFZkhzc3DjfLtJo/M1hdtt648APcZdmAIgWH6fh3eJZ0qbiPh8RStYH7I2COmnlMw4+t/B5mlhYVSgwPK2Ir736Mh+P9Bw0fF8r9Ghhs4AJzpU0RiK9d1tCsrLfK/hSRwTXhtsSB6eDWEGkO7oeEIz43mgn0sv3SrA9JNHzYkg="
key = "2e35f242a46d67eeb74aabc37d5e5d05"
aes = OpenSSL::Cipher::Cipher.new('aes-128-cbc')
aes.decrypt
aes.key = key.scan(/../).collect{ |x| x.hex }.pack('c*')
aes.iv = Base64.decode64(data)[0...16]
puts aes.update(Base64.decode64(data)[16..-1]) + aes.final
# => JSON data...
Run Code Online (Sandbox Code Playgroud)
作为CryptoJS的新手,我没有把工作替代方案放在一起.这是我到目前为止所做的:
data = "IYkyGxYaNgHpnZWgwILMalVFmLWFgTCHCZL9263NOcfSo5lBjAzOZAtF5bF++R0Bi+9c9E+p3VEr/xvj4oABtRWVJ2wlWzLbYC2rKFk5iapFhb7uZCUpO4w4Su3a5QFa2vInjYueziRoqySZd/DpstMJ8rsJ94VGizFFFZ1l0sw1ax+wfBAv5+wHs/hlnHi/ea66KBO3rgXKahvV28h+4bh5etc8RCrmiiNbfg6Oj0jQJDjdYIdW8T9YPOI9E1hih8lbfRnMWcOFJgYekfLpoy5LI525UGnlM46J1k6ekLqsn9FqvbiOOoLgqa4YqBm1i9P0ePyjkME+t+RiL8xXX+ItgOYr9G7kM64wlTJPCW8B/crmUdmGzQNC/hD/u/8wfHBS2f8u6OtQMG/+Kpk1oju8lcUZGI/4S8A6/OuktvQr2zgnbs2aADMrM37Oait/pJ3G73S7NwVT8EaK+X43c0C/fUvW2/bD/rqCNpAh9WQlz4Cj6JHwjbmwuind6aCimF1tHjXuR9FXu+g17sPT4ZkKZ6aeBG+m170XdCGn2hVM0wH1rh3VeCG2u/JFqfuGKGSoqeHeNY/icu9pEhtZDzHd7aPoaMXcWvXC9PjooBf7GM1EPacSdnon1kBobjtKSt1l15DjO5TMrJoX7VO7GotQwo+uI/u5Kop01hBXxyxyggl1/8N0ESohPJoqLDrIwvbGK5kW4B49FVPnx9CMvjZDdSsoxPAh+hx6SPe8Hj0Nx4bRs06cbtOkte/V8QSYIqjiJDleEqPrdiKlvgToZz9L29ZR/3Ln65qU1sq7q9c0SEYxIopV7TdTjFS7y76zDPFZkhzc3DjfLtJo/M1hdtt648APcZdmAIgWH6fh3eJZ0qbiPh8RStYH7I2COmnlMw4+t/B5mlhYVSgwPK2Ir736Mh+P9Bw0fF8r9Ghhs4AJzpU0RiK9d1tCsrLfK/hSRwTXhtsSB6eDWEGkO7oeEIz43mgn0sv3SrA9JNHzYkg=";
key = "2e35f242a46d67eeb74aabc37d5e5d05";
CryptoJS.AES.decrypt(atob(data).substring(16), key, {
iv: atob(cipher).substring(0, 16),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
Run Code Online (Sandbox Code Playgroud)
CryptoJS是否以某种不同的方式期望数据,密钥和初始化向量?据我所知,IV是数据中的前16个字节.
我问这个问题是为了确认C#中的RijndaelManaged类是否等同于AES加密.从我读过的内容来看,RijndaelManaged是实现AES加密的首选算法.有人可以确认一下吗?
RijndaelManaged算法可以安全地用于Web项目吗?谢谢 :)
对于新的RijndaelManaged(),文档说它支持128位和最多256位的密钥.
当您实例化新的RijndaelManaged()时,它会为您创建Key和IV.
它的默认大小是128位?
.NET的AES不直接实现CTR.它只实现CBC,CFB,CTS,ECB和OFB.
我可以使用这些模式中的任何一种并安全地实现它们周围的CTR,还是我需要完全使用不同的库?
提交或更新应用时,您面临的一个问题是:
自上次上传此产品的二进制文件以来,您是否添加或更改了加密功能?
图片:
我的问题是,如果我使用从<CommonCrypto/CommonCryptor.h>
库中获得的加密,我是否必须对该Q进行检查?
我有一个文件,我想加密,发送到iPhone,并使用CommonCrypto在iPhone上解密.与同事交谈时,我得到了不同的回答.有些人认为,由于它是一个包含在内的公平游戏框架,其他人则表示你必须得到政府的批准.
看起来CommonCrypto支持(充其量)采用ECB密码模式的AES 128位加密.所以,这就是我计划使用的东西.
附注:我计划在github 上使用AlanQuatermain/aqtoolkit中的NSData+CommonCrypto
类别.这只是CommonCrypto的一个包装,仅此而已.
相关的是,如果您使用HTTPS(SSL),是否必须选中YES?请参阅进行HTTPS(TLS)连接的应用程序的iPhone加密导出合规性 - 续.我不需要https连接,但这让我感到惊讶......
我只想用openSSL测试这三种模式的AES:128,192和256密钥长度,但我的解密文本与我的输入不同,我不知道为什么.此外,当我传递一个巨大的输入长度(比方说1024字节)时,我的程序显示core dumped
...我的输入始终是相同的,但它无关紧要,至少目前如此.下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
int main(int argc, char **argv)
{
int i;
int keylength;
printf("Give a key length [only 128 or 192 or 256!]:\n");
scanf("%d", &keylength);
/* generate a key with a given length */
unsigned char aes_key[keylength];
memset(aes_key, 0, sizeof(aes_key));
if (!RAND_bytes(aes_key, keylength))
{
exit(-1);
}
aes_key[keylength-1] = '\0';
int inputslength;
printf("Give an input's length:\n");
scanf("%d", &inputslength);
/* generate input with a given length */
unsigned char aes_input[inputslength+1];
memset(aes_input, '0', sizeof(aes_input)); …
Run Code Online (Sandbox Code Playgroud) 请告诉我,如何检查OpenSSL是否支持/使用Intel AES-NI?
aes ×10
encryption ×6
c# ×4
openssl ×3
.net ×2
c ×1
commoncrypto ×1
cryptography ×1
cryptojs ×1
https ×1
ios ×1
java ×1
javascript ×1
pkcs#5 ×1
pkcs#7 ×1
ruby ×1