我们有一个用于加密的辅助类,老实说,它可能是多年前从 Stack Overflow 复制的。
目前,我们正尝试将部分代码移植到 .NET Core,但我们发现它不起作用,因为 .NET Core 实现RijndaelManaged不支持 256 块大小。从我读到的内容来看,BouncyCastle 似乎仍然应该支持它,但我无法让它工作。“未加密”的文本只是一堆乱码。我确定我做错了什么,但对于我的生活,我无法弄清楚这一点。
这是该类的原始 .Net Framework 版本:
internal static class StringEncryptor
{
private const int Keysize = 256;
private const int _iterations = 1000;
private const int _hashLenth = 20;
public static string Encrypt(string plainText, string superSecretPassPhrase)
{
// Salt and IV is randomly generated each time, but is preprended to encrypted cipher text
// so that the same Salt and IV values can be used when decrypting. …Run Code Online (Sandbox Code Playgroud) 我正在尝试解密已在我的 Rails 项目中加密的字符串。这就是我加密数据的方式:
def encrypt_text(text_To_encrypt)
# 0. generate the key using command openssl rand -hex 16 on linux machines
# 1. Read the secret from config
# 2. Read the salt from config
# 3. Encrypt the data
# 4. return the encypted data
# Ref: http://www.monkeyandcrow.com/blog/reading_rails_how_does_message_encryptor_work/
secret = Rails.configuration.miscconfig['encryption_key']
salt = Rails.configuration.miscconfig['encryption_salt']
key = ActiveSupport::KeyGenerator.new(secret).generate_key(salt, 32)
crypt = ActiveSupport::MessageEncryptor.new(key)
encrypted_data = crypt.encrypt_and_sign(text_To_encrypt)
encrypted_data
end
Run Code Online (Sandbox Code Playgroud)
现在的问题是我无法使用 openssl 解密它。它只是显示了糟糕的幻数。一旦我在 open ssl 中做到了这一点,我的计划就是在 golang 中解密它。
以下是我尝试使用 openssl 解密它的方法:
openssl enc -d -aes-256-cbc …Run Code Online (Sandbox Code Playgroud) 我正在 PHP 中加密文本(openssl_encrypt / 'aes-256-cbc'),然后尝试在 Delphi 7 中解密(DCPCrypt / TDCP_rijndael)。
PHP脚本文件以ANSI编码保存,希望传输的字符串(它是REST API Web服务)与Delphi兼容。
然而,Delphi 解密产生了错误的结果,我猜测代码中有问题。如果您能看一下并发现我在 Delphi 方面的错误,我将不胜感激:
PHP代码:
function encrypt($key, $payload) {
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($payload, 'aes-256-cbc', $key, 0, $iv);
return base64_encode($encrypted . '::' . $iv);
}
function decrypt($key, $garble) {
list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2);
return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}
Run Code Online (Sandbox Code Playgroud)
德尔福代码:
var
DCP_rijndael: TDCP_rijndael;
const
cPASSWORD = 'myownpassword';
function Decrypt(AStr: string): string;
var
d, s, iv: String;
p: Integer;
begin
d := Base64DecodeStr(AStr);
p …Run Code Online (Sandbox Code Playgroud) 任何密码学文本都提到,在对对称算法的蛮力攻击中,在尝试一半后有 50% 的机会找到密钥。
例如,具有 56 位密钥的 DES 在前 2 55 次尝试后将有 50% 的机会找到密钥。
为什么在对任何对称加密算法的蛮力攻击中,尝试一半后有 50% 的机会找到密钥?它的数学证明是什么?
我刚刚开始熟悉加密和 .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等)加密功能,如下所示:
Key1(Key2(明文))== Key2(Key1(明文))例如"可交换"(也需要解密 - 你需要两个密钥,无关紧要)
谢谢
我是Java的新手,正在尝试使用AES-128对称加密的混合加密技术,然后在生成的对称密钥上使用RSA-1024非对称加密.有人可以帮助我为什么会得到这个例外.我已经关注了其他帖子,并在相应的文件夹中下载了Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files第6版.
Code snippet:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.security.Key;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
public class MainClass {
/**
* @param args
* Encryption and Decryption with AES/ECB/PKCS7Padding and RSA/ECB/PKCS1Padding
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
System.out.println("Enter a Message to be encrypted!");
// Read an input from console
InputStreamReader …Run Code Online (Sandbox Code Playgroud) java encryption cryptography public-key-encryption encryption-symmetric
我目前正在尝试学习一些关于加密的东西,它的算法以及它是如何工作的。我正在考虑一种加密大文件的方法,对我来说唯一可行的方法似乎是使用对称密钥算法。
所以我在看 AES,虽然将 64k 或 32k 字节块传递给您使用密码哈希创建的 AES 对象似乎没问题,但我仍然很好奇最安全的方法来做到这一点,因为我一直在阅读密码学很容易搞砸。
所以我得到了一个密码,我得到了它的 SHA256 校验和,我在创建我的加密/解密对象时使用它作为密钥。
我找不到答案的其他事情:我应该使用 IV 吗?如果是这样,我必须确保对象在解密时使用与加密时相同的 IV...我该怎么做?
为什么我看到这里有人说即使字节数可以被 16 整除,你也应该填充文件的最后一个块?
最好使用哪种类型的加密模式?
您能否推荐任何其他资源来了解有关安全/密码学的更多信息?
先感谢您
我正在尝试在 C# 中使用(128 位 AES)使用 Random IV 测试 CBC。
在我要解决的问题中,我有 12 字节的输入消息。条件是,如果 PlainText 小于块大小(16 字节),则要使用的填充从 0x01 开始,然后到 6 0x00。
例子:
in ASCII PT = Pay Bob 100%
in hex PT = 50 61 79 20 42 6f 62 20 31 30 30 24
PT with Padding = 50 61 79 20 42 6f 62 20 31 30 30 24 01 00 00 00
Run Code Online (Sandbox Code Playgroud)
我似乎无法在RijndaelManaged 中找到这个PaddingMode。
任何人都可以建议我如何执行以下操作吗?
编辑:
public class CBC
{
public CBC()
{
} …Run Code Online (Sandbox Code Playgroud) c# cryptography encryption-symmetric rijndaelmanaged cbc-mode
我将不胜感激关于以下方面的澄清和建议:
我的项目要求我在 Nodejs 环境中使用对称数据加密(使用 AES)来保护数据库 (mongodb) 上的数据。理想情况下,我想这样做:
将对称密钥作为密钥存储在 Azure 密钥保管库中,然后对保管库进行“加密”调用,以使用密钥对数据执行 AES 加密。加密数据作为对我的应用程序的响应发送,然后以加密形式存储在数据库中。
在阅读了 MS Azure 的文档和相关博客文章后,我感到很困惑,其中一些消息来源声称支持对称密钥加密,但没有关于此的官方文档。
任何人都可以建议这是否是 Azure Key Vault 支持的所有密钥类型和算法的详尽列表? https://msdn.microsoft.com/en-us/library/azure/dn903623.aspx#BKMK_KeyTypes
这似乎也是一个选项(http://www.nuget.org/packages/Microsoft.Azure.KeyVault.extensions),但仅适用于 .NET 上的环境。喜欢 Nodejs 吗?
如果目前确实不支持对称密钥/加密,那么任何人都可以为我的上述方法提供替代方法吗?
谢谢,非常感谢。
encryption ×6
cryptography ×4
c# ×2
.net ×1
aes ×1
bouncycastle ×1
cbc-mode ×1
delphi ×1
delphi-7 ×1
java ×1
node.js ×1
openssl ×1
php-openssl ×1
python ×1
ruby ×1
security ×1