标签: block-cipher

整数的对称双射算法

我需要一种能够将32位有符号整数与另一个32位有符号整数进行一对一映射(即无冲突)的算法.

我真正关心的是足够的熵,因此函数的输出似乎是随机的.基本上我正在寻找类似于XOR Cipher的密码,但它可以生成更多任意外观的输出.虽然默默无闻,但安全并不是我真正关心的问题.

编辑以便澄清:

  1. 算法必须是对称的,这样我就可以在没有密钥对的情况下反转操作.
  2. 该算法必须是双射的,每个32位输入数必须生成一个32位唯一编号.
  3. 函数的输出必须足够模糊,只在输入中添加一个应该对输出产生很大影响.

预期结果示例:

F(100)= 98456
F(101)= -758F
(102)= 10875498
F(103)= 986541
F(104)= 945451245
F(105)= -488554

就像MD5一样,改变一件事可能会改变很多事情.

我正在寻找一个数学函数,所以手动映射整数不是我的解决方案.对于那些提出要求的人来说,算法速度并不是很重要.

algorithm encryption-symmetric bijection block-cipher

32
推荐指数
5
解决办法
5128
查看次数

如何检测分组密码模式

如何通过CBCECB模式检测邮件是否为crypt ?

我已经创建了一个在AES 128 CBCECB中随机加密的功能,我在明文密文之间进行了汉明,但是接缝与密码模式没有关联.

如何检测分组密码模式

先感谢您

aes ecb block-cipher cbc-mode

15
推荐指数
1
解决办法
9538
查看次数

使用aes_256_cbc密码加密时的默认IV是多少?

我在一个文件中生成了一个随机的256位对称密钥,用于使用OpenSSL命令行加密某些数据,我需要使用OpenSSL库以编程方式对其进行解密.我没有成功,我认为问题可能出在我正在使用(或不使用)的初始化向量中.

我使用以下命令加密数据:

/usr/bin/openssl enc -aes-256-cbc -salt -in input_filename -out output_filename -pass file:keyfile
Run Code Online (Sandbox Code Playgroud)

我正在使用以下调用来初始化数据的解密:

EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, keyfile.data(), nullptr))
Run Code Online (Sandbox Code Playgroud)

keyfile是一个vector<unsigned char>保存密钥的32个字节.我的问题是关于最后一个参数.它应该是密码算法的初始化向量.加密时我没有指定IV,因此必须使用某些默认值.

为该参数传递nullptr是否意味着"使用默认值"?是否为默认值,并且没有任何内容添加到第一个密码块?

我应该提一下,我能够在不提供IV的情况下从命令行解密.

c++ encryption openssl aes block-cipher

14
推荐指数
2
解决办法
4497
查看次数

使用AES-GCM的协议的nonce/IV的来源和重要性

我正在制作一个使用AES加密的数据包(即非流)的协议.我决定使用GCM(基于CTR),因为它提供了集成身份验证,并且是NSA套​​件B的一部分.使用ECDH协商AES密钥,其中公钥由可信联系人签名,作为网络的一部分 - 使用像ECDSA这样的信任.我相信我需要一个用于GCM的128位随机数/初始化向量,因为即使我使用256位密钥进行AES,它总是一个128位分组密码(对吗?) 我将使用96位IV后阅读BC代码.

我绝对没有实现我自己的算法(只是协议 - 我的加密提供程序是BouncyCastle),但我仍然需要知道如何使用这个nonce而不用自己的脚.在具有相同DH密钥的两个人之间使用的AES密钥将保持不变,因此我知道不应将同一个随机数用于多个数据包.

我可以简单地在数据包前加一个96位伪随机数,并让收件人将其用作nonce吗?这是点对点软件,数据包可以随时发送(例如,即时消息,文件传输请求等),速度是一个大问题,所以最好不要使用安全随机数源.nonce根本不必是秘密的,对吧?或者必然像"加密安全"PNRG一样随机?维基百科说它应该是随机的,否则它很容易受到选择的明文攻击 - 但是两个声明旁边都有一个"需要引用",我不确定这是否适用于分组密码.我是否可以使用一个计数器来计算从给定的AES密钥开始的1个发送的数据包数(与128位数的计数器分开)?显然这会使nonce可预测.考虑到GCM进行身份验证以及加密,这是否会损害其身份验证功能?

security cryptography aes block-cipher

12
推荐指数
1
解决办法
5991
查看次数

CTR模式使用初始向量(IV)

据我所知,CTR模式不使用初始向量.它只需要一个计数器,用给定的密钥对其进行加密,然后用明文对结果进行异或,以获得密文.

其他分组密码模式,如CBC,在进行加密之前,它们使用初始向量对明文进行异或.

所以这是我的问题.我在Java中使用以下代码(使用bouncycastle库):

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] result = cipher.doFinal("Some plaintext");
Run Code Online (Sandbox Code Playgroud)

使用相同的键对上述代码的每次不同调用都会产生不同的输出!但是在做的时候:

byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, key, IV);

byte[] result = cipher.doFinal("Some plaintext");
Run Code Online (Sandbox Code Playgroud)

我在上述代码的每次调用中都会得到相同的结果.但为什么会这样呢?我的意思是,CTR不需要IV,那么为什么当我不在每次通话中给出IV时我会得到不同的结果,当我给出IV时它会返回相同的结果?如果我在使用点击率时总是使用上面的IV(全零),那会安全吗?

任何想法都会非常有用.谢谢

java cryptography initialization-vector block-cipher

8
推荐指数
1
解决办法
8260
查看次数

任何拥有C#,Delphi或FreePascal实现的PRESENT Ultra-Lightweight Block Cipher加密的人?

前一阵子的论文得到了发表于PRESENT:超轻量级分组密码安德烈·波格丹诺夫等人成为ISO标准29192-2:2012.

是否有人使用单元测试进行C#,Delphi或FreePascal实现?

这是在这里问的,我只是想帮忙.

c# delphi iso freepascal block-cipher

8
推荐指数
1
解决办法
651
查看次数

这种AES加密是否足够安全?

我从http://www.ravenblast.com/index.php/blog/android-password-text-encryption/获得了这个代码,尽管它有效,但我越来越怀疑它不够安全.根据其他来源,似乎没有任何初始化向量.

public static String encrypt(String toEncrypt, byte[ ] key) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[ ] encryptedBytes = cipher.doFinal(toEncrypt.getBytes());
    String encrypted = Base64.encodeBytes(encryptedBytes);
    return encrypted;
}

public static String decrypt(String encryptedText, byte[ ] key) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] toDecrypt = Base64.decode(encryptedText);
    byte[] encrypted = cipher.doFinal(toDecrypt);
    return new String(encrypted);
}
Run Code Online (Sandbox Code Playgroud)

java security encryption aes block-cipher

6
推荐指数
1
解决办法
352
查看次数

Openssl 中的 ECB、CFB、OFB 密码模式

我知道当我在 Openssl 中使用 CBC 模式时,我可以将输入作为块大小的倍数。但是其他模式呢?欧洲央行、CFB、OFB?我看过一个文档,但对我来说并不完全清楚。我应该循环调用它们吗?

可以说,欧洲央行。它一次加密 64 位。所以伪代码看起来像这样(应该像这样)?

int len = 512, c = 0;
unsigned char in[len], out[len]; 
while(c < len)
{
  Aes_ecb_encrypt(in+c, out+c, &enckey, AES_ENCRYPT);
  c += 8;
}
Run Code Online (Sandbox Code Playgroud)

但是使用上面的代码,它并没有加密好。当我c += 8;变成c += 16;它的时候。这样做的好方法是什么?我的意思是,我们都知道 8x8 = 64 位,所以这应该是正确的,但事实并非如此,只有当我有c += 16;.

其他密码模式呢?

ECB 模式示例(请注意,该问题也与其他模式有关;)):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/rand.h>

// a simple hex-print routine. could be modified to print 16 bytes-per-line
static void hex_print(const void* pv, …
Run Code Online (Sandbox Code Playgroud)

c encryption openssl mode block-cipher

5
推荐指数
1
解决办法
1万
查看次数

如何在Golang中使用AES256-GCM加密文件?

AES256-GCM可以在https://gist.github.com/cannium/c167a19030f2a3c6adbb5a5174bea3ff中实现

但是,Seal接口方法cipher.AEAD具有签名:

Seal(dst, nonce, plaintext, additionalData []byte) []byte
Run Code Online (Sandbox Code Playgroud)

因此,对于非常大的文件,必须将所有文件内容读入内存,这是不可接受的。

一种可能的方法是在和上实现Reader/ Writer接口,但是不是由AEAD的那些分组密码“模式”解决吗?所以我想知道这是否是golang密码库的设计错误,还是我错过了GCM的重要知识?SealOpen

encryption go block-cipher

5
推荐指数
1
解决办法
2526
查看次数

libgcrypt如何递增CTR模式的计数器?

我使用libgcrypt的CTR模式实现使用AES-256加密文件.我希望能够部分解密文件(例如,解密20个块中的5-10个块而不解密整个文件).

我知道通过使用CTR模式,我应该能够做到这一点.我所需要的只是知道正确的计数器.问题在于我所拥有的只是块0的初始计数器.例如,如果我想解密块5,我需要另一个计数器,通过对每个块的初始计数器执行一些操作来实现到5.

我似乎无法找到libgcrypt公开的API,以便为给定初始计数器的后续块计算计数器.

在给定块#0的计数器的情况下,如何计算后续块的计数器(例如块#5)?

cryptography block-cipher libgcrypt ctr-mode

5
推荐指数
1
解决办法
100
查看次数