我成功加密和解密,但是当我解密该值时,字符串末尾会出现奇怪的字符" ".最初$_POST['value']没有空格或任何奇怪的字符.
我怎么解决这个问题?
我用这个加密:
$key = 'my key';
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$id = mcrypt_generic($td, $_POST['value']);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
Run Code Online (Sandbox Code Playgroud)
我用这个解密:
$key = 'my key';
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$id = mdecrypt_generic($td, $_COOKIE['value']);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
Run Code Online (Sandbox Code Playgroud) 我有一个PHP脚本创建一个编码值,例如:
m>^æ–S[J¯vÖ_ÕÚuÍÔ'´äœÈ‘ ®@M©t²#÷[Éå¹UçfU5T°äÙ“©”ˆÇVÝ] [’e™a«Ã°7#dÉJ>
Run Code Online (Sandbox Code Playgroud)
然后我需要在vb.net应用程序中解码这个问题是上面的值可以有任何字符.VB.net无法处理它:
dim strCryptedString As String = 'm>^æ–S[J¯vÖ_ÕÚuÍÔ'´äœÈ‘ ®@M©t²#÷[Éå¹UçfU5T°äÙ“©”ˆÇVÝ] [’e™a«Ã°7#dÉJ>"
Run Code Online (Sandbox Code Playgroud)
那么任何建议如何处理这个价值?
我知道PHP的mcrypt_decrypt已经有一百万个帖子了,但是我找不到一个与我的结果相同的帖子.我有一对简单的加密/解密函数,我想用它来对数据执行双向加密.奇怪的是,对于我提供给函数的任何随机字符串的大约4%,它将不会成功解密.例如,如果我创建一个从0到9999的"for循环",并加密和解密这些数字的字符串版本,则每次都会失败相同的值,这些值取决于我传入函数的键.我可以传递任何密钥,虽然失败的具体值会发生变化,但失败的值的百分比将保持大致不变.
我已经尝试了没有IV参数的ECB模式,并且我尝试了带有IV参数的CBC模式,它产生了相同的结果.
这是我在ECB模式下的加密功能:
function mc_encrypt($string, $mc_key) {
$passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($string), MCRYPT_MODE_ECB));
$encode = base64_encode($passcrypt);
return $encode;
}
Run Code Online (Sandbox Code Playgroud)
这是我在ECB模式下的解密功能:
function mc_decrypt($string, $mc_key) {
$decoded = base64_decode($string);
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB));
return $decrypted;
}
Run Code Online (Sandbox Code Playgroud)
CBC模式版本是相同的,除了它使用mcrypt_create_iv()函数在加密中创建IV,并将其作为解密中的参数传递.
在我的服务器上使用这些函数并使用'abc'作为测试加密密钥,如果我从0运行到300,则以下值将无法正确解密:
4,6,70,145,151,176,237,254,275
如果我将加密密钥更改为其他内容,它将更改哪些值正确返回,但不会更改值返回的频率.
有什么建议???
提前致谢!
我需要加密一些 SOAP 标头字段,并且我目前在使用 PHP 5.6 版本的项目中使用以下代码。
function getBaseEncoded($data, $key)
{
$size = $this->pkcs5_pad($data, mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB));
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);
$result = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $size, MCRYPT_MODE_ECB, $iv);
return trim(base64_encode($result));
}
private function pkcs5_pad($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat (chr($pad), $pad);
}
Run Code Online (Sandbox Code Playgroud)
发生的情况是,现在我手头有一个类似的项目,但使用 PHP 7,并且不推荐使用 MCRYPT 函数,我需要将其切换到 OPENSSL_ENCRYPT。
下面的代码是我的第一次尝试:
function getBaseEncoded($data, $key)
{
$result = openssl_encrypt($data, 'AES-128-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);
return trim(base64_encode($result));
}
Run Code Online (Sandbox Code Playgroud)
但我现在收到一个 SOAP 错误消息
SoapFault => 无法连接到主机
它让我思考问题是否出在我的新功能上?
我想在 vagrant 机器上安装 mcrypt。
操作系统是 Ubuntu。
哪个是命令?
我需要在服务器端进行中到强加密,所以我想我会在PHP中使用mcrypt.如果我使用下面的函数,原始字符串的开头会在解密后变成二进制垃圾.(这不是额外添加垃圾的常见问题,而是我的字符串被更改.)根据文档,mcrypt_encrypt()应该填充足够的字符以匹配所选算法的块大小,但我怀疑它不起作用.
但是,如果我手动将其填充到Rijndael的128位(16字节)的块大小,它也不起作用.我可以使这个工作的唯一方法是通过预先填充一些足够长的字符串(可能)覆盖带状块,并在该字符串和我的数据之间添加一个已知的前缀,如"DATA#".解密后,该块已被部分损坏,但我的前缀和之后的所有数据都已正确解密.
$GLOBALS['encryptionmarker'] = 'DATA#';
function encrypt($plain, $key) {
/*
// workaround because beginning of decrypted string is being mangled
// so we simply prefix with some text plus marker
$prefix = str_pad('', 128, '#', STR_PAD_RIGHT).$GLOBALS['encryptionmarker'];
$plain = $prefix.$plain;
*/
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $plain, MCRYPT_MODE_CFB,
mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
MCRYPT_DEV_URANDOM));
return $encrypted;
}
function decrypt($encrypted, $key) {
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CFB,
mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
MCRYPT_DEV_URANDOM));
/*
// workaround: remove garbage
$pos = strpos($decrypted, $GLOBALS['encryptionmarker']);
$decrypted = …Run Code Online (Sandbox Code Playgroud) 我对c和Java之间的加密/解密感到疯狂,但到目前为止,Java中的加密字符串和c中的加密字符串看起来并不相同.我已经调查了base64编码/解码但是在疯狂地找到java和c的库后,各自的base64结果看起来不同了!我认为这是在Java UTF16字符串之间进行转换,在java中保存字节或者AES选项(128/256密钥,PK5填充或谁知道什么),或者终端的UTF8转换或上述荒谬组合之间的转换问题.到目前为止,我得到:
user1@comp1:~/Desktop$ gcc AES.c /usr/lib/libmcrypt.a -lssl -lcrypto -lpthread
user1@comp1:~/Desktop$ /usr/java/jdk1.6.0_25/bin/javac AES.java
user1@comp1:~/Desktop$ ./a.out
Before encryption: test text 123
After encryption: 49 -60 66 43 -8 66 -106 0 -14 -44 3 47 65 127 -110 117
After decryption: test text 123
user1@comp1:~/Desktop$ java AES
Before encryption: test text 123
After encryption: -110 21 23 59 47 120 70 -93 -54 -93 -12 -70 -91 83 -113 85
After decryption: test text 123
Run Code Online (Sandbox Code Playgroud)
我认为我真的需要帮助从某人到低级编码,下面分别是Java和c的代码:
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.KeyGenerator; …Run Code Online (Sandbox Code Playgroud) 我尝试使用php mcrypt TripleDES加密docx格式文件.
当我试图解密文件时,我得到如下错误.
无法打开Office Open XML文件file_name,因为内容存在问题.
这是下面的代码
function Encrypt($source,$key,$iv) {
$cipher = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');
mcrypt_generic_init($cipher, $key, $iv);
$result = mcrypt_generic($cipher, $source);
mcrypt_generic_deinit($cipher);
return $result;
}
function Decrypt($source,$key,$iv) {
$cipher = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');
mcrypt_generic_init($cipher, $key, $iv);
$result = mdecrypt_generic($cipher, $source);
mcrypt_generic_deinit($cipher);
return $result;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
Laravel在本地运行良好,但在服务器上我得到以下内容:
Laravel需要Mcrypt PHP扩展.
但是我无法在我的服务器上安装mcrypt,因为我没有管理员权限.在我公司的服务器上安装模块的过程将是痛苦的,最好只使用另一个框架.但是Laravel看起来如此现代和漂亮,如果不问这个问题我就不能放手:在没有php-mcrypt的情况下运行Laravel是否有可能?
使用mcrypt在PHP中加密
<?php
$string = 'Secret Message';
$key = 'd4b494e4502a62edd695a903a94c2701';
$iv = '02f30dffbb0d084755f438f7d8be4a7d';
$encrypted = base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
$key,
$string,
MCRYPT_MODE_CBC,
$iv
)
);
//$encrypted results in 'nYoFAiyDARVSI09lH/IPdim5TvE51izVjk6sc2AK9Rg='
?>
Run Code Online (Sandbox Code Playgroud)
使用CryptoJS在Javascript中解密
<script>
var encrypted = 'nYoFAiyDARVSI09lH/IPdim5TvE51izVjk6sc2AK9Rg=';
var key = CryptoJS.enc.Hex.parse('d4b494e4502a62edd695a903a94c2701');
var iv = CryptoJS.enc.Hex.parse('02f30dffbb0d084755f438f7d8be4a7d');
var decrypted = CryptoJS.AES.decrypt(encrypted,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});
console.log(decrypted.toString(CryptoJS.enc.Utf8)); //prints an empty string
</script>
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何让Javascript端吐出原始文本.
mcrypt ×10
php ×7
encryption ×4
aes ×2
cryptography ×2
c ×1
cryptojs ×1
java ×1
javascript ×1
laravel ×1
mojibake ×1
openssl ×1
string ×1
ubuntu ×1
variables ×1