使用aes_cfb_encrypt和aes_cfb_decrypt函数,我有以下问题.
我正在加密大约100mb的大文件,并且第一次传递随机*iv,我是否必须在循环的其余部分使用相同的*iv,或者我必须使用上次调用时更新的*iv加密块.
最后,我正在处理结构化文件,所以我必须使用Sizeof(struct)作为缓冲区的长度,或者必须使用sizeof(struct)*8作为加密或解密的缓冲区长度.请指导..
AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf, int len, unsigned char *iv, aes_encrypt_ctx cx[1]);
AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf, int len, unsigned char *iv, aes_encrypt_ctx cx[1]);
Run Code Online (Sandbox Code Playgroud)
aes_cfb_encrypt我一直在使用AES-CBC进行加密,每次加密纯文本时我都会使用随机IV.据我所知,这是推荐的方法.
我一直在研究AES-GCM/AES-CTR,主要用于AEAD.我还没有用这个来实现任何东西,但从我读过的所有内容来看,基本上nonce只是一个短路的IV,并且有一个内部计数器用于每个加密调用.开发人员/需要确保在32位计数器循环返回之前更改随机数,否则相同的随机数(IV)可能与相同的密钥一起使用,该密钥可以加密相同的纯文本并泄漏加密密钥.
我真正不明白的是为什么AES-CBC可以随机使用IV,但我读过的一些内容表明AES-GCM的随机nonce(IV)是一个坏主意.我唯一能想到的是AES-CBC的IV比AES-GCM的nonce更长,因此AES-GCM的重复nonce的可能性更大.
我需要加密几个字节到10到20 GB之间的数据.我知道AES-GCM对计数周期之前可以加密的数据大小(~60GB)有限制.我可以解决这个限制,因为我的数据低于此限制.
有人可以解释为什么不为AES-GCM建议随机现时的原因吗?
我有很多小秘密,我想在数据库中加密存储.数据库客户端将具有密钥,并且数据库服务器将不处理加密和解密.我的所有秘密都是16字节或更少,这意味着使用AES时只有一个块.我使用常量IV(和密钥)使加密确定性,我做确定性加密的原因是能够使用密文轻松查询数据库,并确保相同的秘密不会存储两次(通过使列UNIQUE ).只要密钥是秘密的,我可以看到这样做应该没有问题.但我想确定:我是对还是错?如果我错了,可以做些什么攻击?
BTW:哈希在这里很无用,因为可能的明文数量相对较少.使用哈希,获得原始明文是微不足道的.
我刚刚开始熟悉加密和 .NET 框架。在查看了许多示例之后,我看到了一个重复的模式,在使用 .NET Class 时会让人感到困惑Rfc2898DeriveBytes。使用此类获取加密密钥和初始化向量时,似乎使用了相同的方法。
以下是MSDN 博客中的一些代码,用于演示获取密钥和初始化向量。
byte[] salt = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes("P@$$w0rd", salt, 1000);
// generate an RC2 key
byte[] key = pwdGen.GetBytes(16);
byte[] iv = pwdGen.GetBytes(8);
Run Code Online (Sandbox Code Playgroud)
我在其他地方也看到过这个。我想我会认为它会是这样的......
// generate an RC2 key
byte[] key = pwdGen.GetKey();
byte[] iv = pwdGen.GetInitializationVector();
Run Code Online (Sandbox Code Playgroud)
我一定在这里遗漏了一些东西。如果密钥和初始化向量 (IV) 只是随机数,那么在使用正确的密码和盐时如何再次获得它们?
我对开发加密的东西比较陌生.现在我正在尝试使用带有AES-GCM的BouncyCastle编写一个加密和解密字符串的类.我读到了实施加密时必须考虑的事项.其中之一是你应该总是使用随机IV.问题是,每当我尝试使用IV初始化我的密码时,它都不会正确解密我的文本.
它只会抛出以下异常:
javax.crypto.AEADBadTagException: mac check in GCM failed
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$AEADGenericBlockCipher.doFinal(Unknown Source)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at BouncyCastleEX.decrypt(BouncyCastleEX.java:78)
at BouncyCastleEX.main(BouncyCastleEX.java:43)
Run Code Online (Sandbox Code Playgroud)
我正在使用以下方法来加密和解密我的数据.
private static final String fallbackSalt = "ajefa6tc73t6raiw7tr63wi3r7citrawcirtcdg78o2vawri7t";
private static final int iterations = 2000;
private static final int keyLength = 256;
private static final SecureRandom random = new SecureRandom();
public byte[] encrypt(String plaintext, String passphrase, String salt)
throws Exception {
SecretKey key = generateKey(passphrase, salt);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC"); …Run Code Online (Sandbox Code Playgroud) I have a site A and site B where site A needs to send sensitive encrypted data to site B for site B to decrypt. I know that its best to encrypt using a randomized cryptographic initialization vector (iv) which is unique to each secret string, but my question is:
鉴于传输是使用 https 进行的,将 iv 与密文一起发送是否安全?是否有转移 iv 的最佳做法?
我的理解是 iv 是密文开头的一部分,所以我倾向于相信 iv 没有真正的安全威胁。
谢谢!
以下node.js代码尝试在ECB模式下使用AES 128创建密码,初始化向量(IV)填充0字节.<< rant >>我知道应该不惜一切代价避免使用ECB模式进行加密,但它仍然需要支持在第二次世界大战之前构建的遗留系统(当首次发现加密ECB模式的危险时). <</rant >>.
let keyBuffer = Buffer.from("DoNotUseUTF8Keys",'utf8');
let ivBuffer = Buffer.alloc(16); // 16 bytes set to 0
//try {
try {
let cipher = createCipheriv("AES-128-ECB", keyBuffer, ivBuffer);
} catch (e)
{
console.log(e.message);
}
Run Code Online (Sandbox Code Playgroud)
当调用createCipheriv(或createDeciperiv)时,node.js代码抛出"无效的IV长度".
对于128位(16字节)密码,AES应具有16字节的初始化向量(IV).
这是一个错误还是我做错了什么?
我使用带有Rijndael类的AES加密来加密密码,然后将其存储在配置文件中.
我知道什么是初始化矢量.我在SO上读过线程(例如我应该使用初始化向量(IV)和我的加密吗?)和维基百科上的文章.
但是,有一点我不明白:因为您需要在解密过程中使用与加密期间使用的相同的IV,您将被迫使用加密文本存储IV.对每种加密使用独特的IV有什么好处?如果攻击者获得加密文本,他也将获得IV.
我们的Classic ASP应用程序的遗留部分使用了一些代码,这些代码应该用Rijndael(AES)加密/解密字符串.此代码在Internet上找到(Rijndael AES Block Cipher(VB Version)).我已经在SO上发现了一个引用这个精确库的问题,并且问我几乎和我一样,但我怀疑至少有一件事情出错了(除了在bytes数组的开头加上数据的长度加密).vbScript实现似乎根本不向要加密的数据添加IV.所以,我无法将相同的加密与RijndaelManaged匹配,因为它:
有人知道AES是否可以加密.Net中的某些东西而不指定IV(空)?
.net cryptography rijndael asp-classic initialization-vector
我想将AES加密数据存储在DB字段中.
在密文之前存储AES IV(每行唯一)是否安全?例如
IV_CipherText
两者都将在Base64中编码.
使用的密钥不会存储在数据库中.
cryptography ×6
encryption ×6
aes ×3
.net ×2
aes-gcm ×2
asp-classic ×1
bouncycastle ×1
c ×1
c# ×1
c++ ×1
database ×1
java ×1
node.js ×1
pascal ×1
rijndael ×1