我只想用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) 我正在用Java做基于密码的文件加密; 我使用AES作为底层加密算法,PBKDF2WithHmacSHA1
并使用以下代码从盐和密码组合中获取密钥(我从本网站上的另一张慷慨的海报中获得).
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec ks = new PBEKeySpec(password,salt,1024,128);
SecretKey s = f.generateSecret(ks);
Key k = new SecretKeySpec(s.getEncoded(),"AES");
Run Code Online (Sandbox Code Playgroud)
我共享盐,用户在每端输入密码,加密和解密工作正常:-)我的问题是,我希望能够验证用户输入的密码是否正确才能开始(可能很长)解密过程.我知道PBKD规范包含一个可选的2字节验证值,但我不知道如何使用上述方法生成此值.Java是否为此提供支持,或者不支持哪种安全替代方案?
谢谢你的时间.
我正在尝试使用128位AES加密(ECB)加密/解密字符串.我想知道的是如何添加/删除PKCS7填充.似乎Mcrypt扩展可以处理加密/解密,但必须手动添加/删除填充.
有任何想法吗?
我正在尝试使用AES加密和解密字符串,但收到错误我不知道如何解决.这是代码:
public class EncryptionTest{
public static void main(String[] args) {
String encrypt = new String(encrypt("1234567890123456"));
System.out.println("decrypted value:" + (decrypt("ThisIsASecretKey",encrypt)));
}
public static String encrypt(String value) {
try {
byte[] raw = new byte[]{'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'};
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(value.getBytes());
System.out.println("encrypted string:" + (new String(encrypted)));
return new String(skeySpec.getEncoded());
} catch (Exception ex) {
ex.printStackTrace();
}
return …
Run Code Online (Sandbox Code Playgroud) 我想加密/解密许多小的(2-10kB)数据.现在性能还可以:在Core2Duo上,我得到大约90 MBytes/s的AES256(当使用2个线程时).但是我可能需要在将来改进它 - 或者至少减少对CPU的影响.
我是OpenSSL的新手,任何人都可以给我一个如何从C文件初始化AES CTR模式的提示.我知道这是方法的签名但是我遇到了参数问题,没有很多文档也没有明确的例子如何进行简单的加密.如果有人可以举例说明这种方法,我将不胜感激.提前致谢!
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
const unsigned long length, const AES_KEY *key,
unsigned char ivec[AES_BLOCK_SIZE],
unsigned char ecount_buf[AES_BLOCK_SIZE],
unsigned int *num);
Run Code Online (Sandbox Code Playgroud)
Hi Caf我非常感谢你的快速回答它真的很有用,并且是我在网上找到的最好的例子.我试图打开与未定长度的文件进行加密和写入与生成密文的另一个文件,然后打开加密的文件,并恢复明文.我需要使用相当数量MB的文件,因为我想对CPU的性能进行基准测试.但是我在解密时仍然遇到问题.不知何故,当解密一个相当大的txt文件(1504KB)时,它不会解密它完成,我得到一半的明文,另一半仍然加密.我认为这可能与iv的大小或我打电话给柜台的方式有关.这是我到目前为止:
#include <openssl/aes.h>
#include <stdio.h>
#include <string.h>
struct ctr_state {
unsigned char ivec[16];
unsigned int num;
unsigned char ecount[16];
};
FILE *fp;
FILE *rp;
FILE *op;
size_t count;
char * buffer;
AES_KEY key;
int bytes_read, bytes_written;
unsigned char indata[AES_BLOCK_SIZE];
unsigned char outdata[AES_BLOCK_SIZE];
unsigned char ckey[] = "thiskeyisverybad"; // It is 128bits though..
unsigned …
Run Code Online (Sandbox Code Playgroud) 我之前已经看到过这个问题,但在这些情况下,海报想要在面向公众的网站上加密某些内容(通常是网址),而且回复主要是"不要!".然而,在我的情况下,JavaScript将存储在非公共内部系统中,所以我认为我有更多的余地.类似问题的一个例子是:如何在javascript中加密url并在c#中解密 - 并且答案实际上没有回答问题.
我的"JavaScript"实际上是"SuiteScript",其定义为"SuiteScript是一种基于JavaScript的API,可让开发人员扩展NetSuite",其中NetSuite是托管的CRM软件包,因此用于加密我的字符串的任何编码都将是隐藏给每个人,除了我公司的员工(因此被认为安全隐藏).
我想做的是:
我已经google了搜索stackoverflow,但没有发现任何文章或答案,提供了两种技术都可以使用的加密方法的明确说明.有人有这样的指示吗?
我目前使用AES在c#中执行大量文本加密/解密.
使用纯软件系统,对于需要解密的大量数据集,可能需要相当长的处理器才能获得相当长的时间.我知道英特尔已经推出了他们的AES-NI指令集,并且AMD已经推出了类似的产品.
我正在使用.NET 4.0,我知道windows CNG框架使用了这些指令集,但似乎并没有AesManaged
在.NET世界中做同样的事情.
有一个梦幻般的项目" CLR安全 ",它建立了一个从.NET 3.5到Windows CNG的网关,但它在一年内没有维护,我宁愿不(如果可能的话)跳上一个垂死的项目.
.NET 4中有一个CNGProvider类,但似乎没有足够的文档可以将AES的工作解密拼凑在一起.
有没有人有这方面的经验,他们可以指出我在正确的方向上如何使用预制的类在纯.NET环境中实现AES-NI,而无需直接从c#进行ap/inv?(如果有一个包装器类,只要它被维护就可以了).
当我使用Cipher时,我观察到以下内容.
加密代码:
Cipher aes = Cipher.getInstance("AES");
aes.init(Cipher.ENCRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());
Run Code Online (Sandbox Code Playgroud)
解密代码:
Cipher aes = Cipher.getInstance("AES");
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());
Run Code Online (Sandbox Code Playgroud)
在运行Decrypt代码时,我得到IllegalBlockSizeException(输入长度必须是16的倍数).
但是,如果我将解密代码更改为
Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding"); //I am passing the padding too
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());
Run Code Online (Sandbox Code Playgroud)
它工作正常.我明白这是在模式中algorithm/mode/padding
.所以我认为这是因为我没有提到填充.所以我尝试在加密过程中给出模式和填充,
加密代码:
Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");//Gave padding during encryption too
aes.init(Cipher.ENCRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());
Run Code Online (Sandbox Code Playgroud)
解密代码:
Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());
Run Code Online (Sandbox Code Playgroud)
但它失败了IllegalBlockSizeException.
是什么原因,为什么例外以及究竟发生了什么.如果有人可以帮忙吗?提前致谢
UPDATE
看起来问题在于我正在加密和解密的字符串.因为,即使我说的代码有效,也并不总是有效.我基本上是在加密UUID(例如:8e7307a2-ef01-4d7d-b854-e81ce152bbf6).它适用于某些字符串,而不适用于某些字符串.
加密String的长度为64,可被16整除.是的,我在同一台机器上运行它.
密钥生成方法:
private Key …
Run Code Online (Sandbox Code Playgroud) 我刚刚开始探索Python.我正在尝试运行AES算法代码,我正面临:
ImportError:没有名为Crypto的模块.
你是如何解决这个问题的?