如何通过CBC或ECB模式检测邮件是否为crypt ?
我已经创建了一个在AES 128 CBC或ECB中随机加密的功能,我在明文和密文之间进行了汉明,但是接缝与密码模式没有关联.
如何检测分组密码模式?
先感谢您
尝试在Go中模拟基本上是AES ECB模式加密的算法.
这是我到目前为止所拥有的
func Decrypt(data []byte) []byte {
cipher, err := aes.NewCipher([]byte(KEY))
if err == nil {
cipher.Decrypt(data, PKCS5Pad(data))
return data
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
我还有一个PKCS5Padding算法,经过测试和工作,它首先填充数据.我无法找到有关如何在Go AES包中切换加密模式的任何信息(它绝对不在文档中).
我有这个代码用另一种语言,这就是我知道这个算法不能正常工作的方式.
编辑:这是我在问题页面上解释的方法
func AESECB(ciphertext []byte) []byte {
cipher, _ := aes.NewCipher([]byte(KEY))
fmt.Println("AESing the data")
bs := 16
if len(ciphertext)%bs != 0 {
panic("Need a multiple of the blocksize")
}
plaintext := make([]byte, len(ciphertext))
for len(plaintext) > 0 {
cipher.Decrypt(plaintext, ciphertext)
plaintext = plaintext[bs:]
ciphertext = ciphertext[bs:]
}
return plaintext
}
Run Code Online (Sandbox Code Playgroud)
这实际上并没有返回任何数据,也许我在将其从编写脚本转换为decripting时搞砸了
我的加密功能正常工作但是我无法弄清楚如何获得解密功能以提供正确的输出.
这是我的加密功能:
function Encrypt($data, $secret)
{
//Generate a key from a hash
$key = md5(utf8_encode($secret), true);
//Take first 8 bytes of $key and append them to the end of $key.
$key .= substr($key, 0, 8);
//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
return base64_encode($encData);
}
Run Code Online (Sandbox Code Playgroud)
这是我的解密功能:
function Decrypt($data, $secret)
{
$text = base64_decode($data);
$data = mcrypt_decrypt('tripledes', $secret, $text, …
Run Code Online (Sandbox Code Playgroud) 我想使用AES-128-ECB密码对单个16字节数据块进行解码和解码.首先,我通过openssl命令行实用程序使用ASCII 16字符串"a_key_simple_key"作为键,ASCII 16字符串"1234567890uvwxyz"作为消息.命令行实用程序将十六进制字符串"142f 7d9e ad8c 0682 30e0 f165 a52f f789"打印为加密消息,然后将其成功解码回原始消息,如下所示:
$ echo -n "1234567890uvwxyz" | openssl aes-128-ecb -K $(echo -n "a_key_simple_key" | xxd -ps) -nopad | xxd
0000000: 142f 7d9e ad8c 0682 30e0 f165 a52f f789 ./}.....0..e./..
$ echo "142f 7d9e ad8c 0682 30e0 f165 a52f f789" | xxd -r -ps | openssl aes-128-ecb -d -K $(echo -n "a_key_simple_key" | xxd -ps) -nopad
1234567890uvwxyz
Run Code Online (Sandbox Code Playgroud)
现在我写了一个简短的C++程序,它也应该这样做.它不起作用.有两个问题:
错误:06065064:数字信封例程:EVP_DecryptFinal_ex:解密错误
我怀疑这两个问题都以某种方式与填充相关联,但我不明白究竟有什么问题以及如何解决它.以下是该计划的完整输出:
$ g++ -Wall -g ssl-aes-128-ecb.c++ -lcrypto -lssl …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用内置的加密库解码Node.js中的以下base64编码的密文
2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A==
Run Code Online (Sandbox Code Playgroud)
它似乎与PHP的mcrypt函数一起使用字符串typeconfig.sys^_-
作为键,如将值输入到http://www.tools4noobs.com/online_tools/decrypt/并选择Blowfish,ECB,Base64 decode所示.
但是,当我在Node.js中运行以下代码时:
var crypto = require('crypto');
var data = "2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A==";
var decipher = crypto.createDecipher('bf-ecb', 'typeconfig.sys^_-');
data = decipher.update(data, "base64", "utf8");
data += decipher.final("utf8");
console.log(data);
Run Code Online (Sandbox Code Playgroud)
我得到垃圾输出:
y
?:????d?(????Q?i??z1??4?? ?k?(? ??a5????u??73c/??(???)????????f????
?ec?-<z?8????(?-L?????I??1L*??u?4?j-??h?@\P)???.?^???q??U???W&?x??85?T-?9,dE<g}?`*?
??|@????k"?!?D'u???,x??7????
??9q=q?q???>?w?T????H3??i)R??zy??C??
??o?
Run Code Online (Sandbox Code Playgroud)
我也尝试过对库本身的测试,因为它似乎能够处理它自己编码的东西:
var crypto = require('crypto')
var cipher = crypto.createCipher("bf-ecb", "key");
var data = cipher.update("foobar", "utf8", "base64");
data += cipher.final("base64");
console.log(data);
var decipher = crypto.createDecipher("bf-ecb", "key");
data = decipher.update(data, "base64", "utf8");
data += decipher.final("utf8");
console.log(data);
Run Code Online (Sandbox Code Playgroud)
生产:
y0rq5pYkiU0=
foobar
Run Code Online (Sandbox Code Playgroud)
但复制并粘贴base64字符串并将其输入http://www.tools4noobs.com/online_tools/decrypt/以及键"key"也会产生垃圾输出. …
我正在尝试使用以下代码在 ECB 模式下进行 aes 128 加密。
from Crypto.Cipher import AES
key = 'abcdefghijklmnop'
cipher = AES.new(key.encode('utf8'), AES.MODE_ECB)
msg = cipher.encrypt(b'hello')
print(msg.hex())
decipher = AES.new(key.encode('utf8'), AES.MODE_ECB)
msg_dec = decipher.decrypt(msg)
print(msg_dec)
Run Code Online (Sandbox Code Playgroud)
但我收到“ValueError:数据必须与 ECB 模式下的块边界对齐”。如果 string 是 16 的倍数,它工作正常。我不知道如何进行填充和取消填充。我们如何解决这个问题?请帮忙
我在加密我正在使用的第三方供应商的价值时遇到了问题.
他们的指示如下:
1) Convert the encryption password to a byte array.
2) Convert the value to be encrypted to a byte array.
3) The entire length of the array is inserted as the first four bytes onto the front
of the first block of the resultant byte array before encryption.
4) Encrypt the value using AES with:
1. 256-bit key size,
2. 256-bit block size,
3. Encryption Mode ECB, and
4. an EMPTY initialization vector.
5) After encryption, you should …
Run Code Online (Sandbox Code Playgroud) 我需要在 JavaScript 中解密一个与 Java 编写的代码具有完全相同的结果的十六进制消息。但是,使用 CryptoJs 的 Javascript 版本返回空结果
Java中的代码:
private static void create()
{
byte[] sessionKey = fromHexString("dae25b4defd646cd99b7b95d450d6646");
byte[] data = fromHexString("2700012e27999bdaa6b0530375be269985a0238e5e4baf1528ebaf34a8e5e8c13a58b25bcb82514ee6c86c02ff77ac52bdbd88");
byte[] payload_data = new byte[48];
byte[] decrypted_data = new byte[48];
for(int i=0;i<48;i++) {
payload_data[i]= data[3+i];
}
try{
SecretKeySpec skeySpec = new SecretKeySpec(sessionKey, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
decrypted_data = cipher.doFinal(payload_data);
}catch(Exception e){
System.out.println(e);
}
String my_data = byteArrayToHex(decrypted_data);
System.out.println(my_data);
}
private static String byteArrayToHex(byte[] a) {
StringBuilder sb = new StringBuilder(a.length * 2);
for(byte b: …
Run Code Online (Sandbox Code Playgroud) 目标:使用 AES-128、ECB、0 填充进行加密和解密的简单CryptoJS 示例。
请参阅下面我的可运行示例。
输入文本是“US0378331005-USD-US-en”,它被加密(希望 AES-128 包含上述所有内容),然后解密(这不起作用)
text: US0378331005-USD-US-en
key: 11A1764225B11AA1
key length: 16
encrypted 951422f8ac8354acf23fbc
decrypted a5126fa0fc3cb4c39a4f3e637be98a73
Run Code Online (Sandbox Code Playgroud)
text: US0378331005-USD-US-en
key: 11A1764225B11AA1
key length: 16
encrypted 951422f8ac8354acf23fbc
decrypted a5126fa0fc3cb4c39a4f3e637be98a73
Run Code Online (Sandbox Code Playgroud)
var text = 'US0378331005-USD-US-en';
var key = '11A1764225B11AA1'; // to ensure AES-128 this has to be 16 bit
console.log('text:', text);
console.log('key:', key);
console.log('key length:', key.length );
text = CryptoJS.enc.Hex.parse(text);
key = CryptoJS.enc.Hex.parse(key);
var iv = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
var encrypted = CryptoJS.AES.encrypt(text, key, { iv: iv, mode: CryptoJS.mode.ECB, …
Run Code Online (Sandbox Code Playgroud)由于我对Java的不完全了解将这个加密代码转换为Python代码,我正在努力.两者应该具有完全相同的结果.非常感谢帮助.
Java函数
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
String s = "testings";
Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
Key key = new SecretKeySpec("6#26FRL$ZWD".getBytes(), "Blowfish");
cipher.init(1, key);
byte[] enc_bytes = cipher.doFinal(s.getBytes());
System.out.println(enc_bytes);
}
}
Run Code Online (Sandbox Code Playgroud)
Python等价
def PKCS5Padding(string):
byteNum = len(string)
packingLength = 8 - byteNum % 8
if packingLength == 8:
return string
else:
appendage = chr(packingLength) * packingLength
return string + appendage
def PandoraEncrypt(string):
from Crypto.Cipher import Blowfish
key = …
Run Code Online (Sandbox Code Playgroud)