我在Perl中有一个小型加密工具,它使用Crypt :: CBC和Blowfish来加密文件.
我想用C或C++编写解密算法......请有人帮我这样做.
对于我正在进行的项目,我需要使用Blowfish以跨NSIS和PHP的兼容方式加密和解密字符串.
目前我正在使用NSIS 的Blowfish ++插件和mcryptPHP 的库.问题是,我不能让他们两个产生相同的输出.
让我们从NSIS Blowfish ++插件开始.基本上API是:
; Second argument needs to be base64 encoded
; base64_encode("12345678") == "MTIzNDU2Nzg="
blowfish::encrypt "test@test.com***" "MTIzNDU2Nzg="
Pop $0 ; 0 on success, 1 on failure
Pop $1 ; encrypted message on success, error message on failure
Run Code Online (Sandbox Code Playgroud)
没有提到它是CBC,ECB,CFB等,而且我对Blowfish不够熟悉,无法通过阅读大部分未记录的来源来讲述.我认为它是ECB,因为PHP文档mcrypt告诉我ECB不需要IV.
我还通过阅读源代码了解到Blowfish ++插件将Base64解码第二个加密参数(我不知道为什么).它还返回Base64编码的字符串.
对于PHP方面,我基本上使用此代码进行加密:
$plainText = "test@test.com***";
$cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, '');
$iv = '00000000'; // Show not be used anyway.
$key = "12345678";
$cipherText = …Run Code Online (Sandbox Code Playgroud) 我有一堆加密和解密形式的消息使用Blowfish和相同的密钥.有没有办法key摆脱这些消息?
任何算法或工具的参考将受到高度赞赏.我只有密码学的基本知识,所以如果问题太广泛而且不够具体,请纠正我.
我想使用Blowfish哈希来哈希密码.
crypt() 在5.3之前的PHP版本中不支持它
我的PHP版本是5.2.14.我怎样才能使用Blowfish哈希?我可以使用PEAR Crypt_Blowfish吗?
我已经搜索了互联网,但似乎有很多实现,其中一些不能正常工作,是否有一个标准或工作的C++ API我可以用来解密河豚加密字符串?
提前致谢
我对密码安全保持有点困惑.假设我有用户帐户表的数据库.这是我保存密码的地方.这时我正在使用盐渍的sha1.
我读基于Blowfish的函数比sha1好,因为它们需要更多时间来处理请求.
是否有任何理由不使用盐渍sha1并将登录尝试次数限制为某个合理的数量(例如每小时50次)作为暴力攻击的"防火墙"?
使用此数据库的人无需强行执行任何操作,因为他可以通过查询更改记录.
我正在使用Blowfish.NET最新版本,但有一个问题.
responce = new byte[6]
{
0x00, 0x80 ,0x01, 0x61, 0x00, 0x00
};
byte[] encrypted = new byte[responce.Length];
blowfish.Encrypt(responce, 2, encrypted, 2, input.Length - 2);
Run Code Online (Sandbox Code Playgroud)
我以正确的方式调用它,我希望它从第三个字节开始读/写,长度是6 - 2,因为我不使用两个字节.
问题:
public int Encrypt(
byte[] dataIn,
int posIn,
byte[] dataOut,
int posOut,
int count)
{
uint[] sbox1 = this.sbox1;
uint[] sbox2 = this.sbox2;
uint[] sbox3 = this.sbox3;
uint[] sbox4 = this.sbox4;
uint[] pbox = this.pbox;
uint pbox00 = pbox[ 0];
uint pbox01 = pbox[ 1];
uint pbox02 = pbox[ 2];
uint pbox03 …Run Code Online (Sandbox Code Playgroud) 我有这段测试代码使用Blowfish(openssl/blowfish.h)来加密,然后解密一个字符串.但是当它再次出现时,它还没有被正确解密.有谁能告诉我为什么好吗?
(从OP的原始版本复制到http://pastebin.com/AaWSF5pX)
#include <stdlib.h>
#include <cstdio>
#include <string.h>
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
// blowfish key
const char *key = "h&6^5fVghasV_Fte";
BF_KEY bfKey;
BF_set_key(&bfKey, strlen(key), (const unsigned char*)key);
// encrypt
const unsigned char *inStr = (const unsigned char *)"hello world\0";
unsigned char *outStr = (unsigned char *)malloc(sizeof(unsigned char) * 100);
BF_ecb_encrypt(inStr, outStr, &bfKey, BF_ENCRYPT);
// decrypt
unsigned char buf[100];
BF_ecb_encrypt((const unsigned char*)outStr, buf, &bfKey, BF_DECRYPT);
std::cout << "decrypted: " << buf << …Run Code Online (Sandbox Code Playgroud) 我用Blowfish编码进行了一些测试并发现了一些东西.编码的字符串并不总是与源字符串一样长.它有时会更短.
如果我想解码编码的字符串,我需要在openssl函数中解码的长度:
BF_cfb64_encrypt(encoded_input,decoded_output,length_to_decode,&key,iv,&num,BF_DECRYPT);
Run Code Online (Sandbox Code Playgroud)
这里的问题是我没有length_to_decodeif if我不知道源字符串的长度.如果我使用解码后的字符串的长度作为length_to_decode,那么这可能太短了.
如果我使用更大的长度,则解码的字符串不正确.那么我需要知道使用blowfish编码解码的长度吗?
在互联网上的所有示例代码中,编码和解码总是在一个函数中进行,并且解码示例使用硬编码长度进行解码.但在现实生活中,我不知道编码字符串的长度,然后呢?
这是一个例子:
source string: sdcfgssssssss
source length: 13
encryption key: s
encrypted output: :‹(
encrypted length: 4
Run Code Online (Sandbox Code Playgroud)
我这样初始化我的钥匙:
BF_KEY key;
const char * keyStr = "s";
BF_set_key(&key, strlen(keyStr), (const unsigned char *)keyStr);
Run Code Online (Sandbox Code Playgroud) 是否可以从河豚加密的密文和明文对中恢复密钥?
我有几个加密和普通的字符串.但我不记得钥匙.
加密字符串24026B7101030657757D01
解密字符串的示例是AC C1312463
$key = '';
$plaintext = '';
$crypttext = '24026B7101030657757D01';
$cache = array();
while($plaintext != 'AC C1312463')
{
$key = random_string();
while(array_search($key,$cache) !== FALSE)
{
$key = random_string();
}
$cache[] = $key;
$bf = new Crypt_Blowfish($key);
$plaintext = $bf->decrypt($crypttext);
}
print_r($key);
die();
Run Code Online (Sandbox Code Playgroud)
假设我有这样的算法.函数random_string应该如何获得32位随机密钥?
我正在尝试创建一个简单的加密类,但结果字符串用非ascii字符填充.我已经尝试过rtrim(),转换为utf8等,如其他一些答案所述.我到底错过了什么?以下是将结果粘贴到Notepad ++中时出现的字符

包含此处字符的Pastebin .在html中显示为't',但将其复制到记事本中会显示其后的数据的随机位.
class Crypter implements ICrypter {
private $Key;
private $Algo;
public function __construct($Algo = MCRYPT_BLOWFISH) {
$this->Key = substr('key', 0, mcrypt_get_key_size($Algo, MCRYPT_MODE_ECB));
$this->Algo = $Algo;
}
public function Encrypt($data) {
//$iv_size = mcrypt_get_iv_size($this->Algo, MCRYPT_MODE_ECB);
//$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$blocksize = mcrypt_get_block_size('blowfish', 'ecb'); // get block size
$pkcs = $blocksize - (strlen($data) % $blocksize); // get pkcs5 pad length
$data.= str_repeat(chr($pkcs), $pkcs); // append pkcs5 padding to the data
$crypt = mcrypt_encrypt($this->Algo, $this->Key, $data, MCRYPT_MODE_ECB);
return …Run Code Online (Sandbox Code Playgroud) php encryption blowfish character-encoding password-encryption
修改我的"问题",以免惹恼当地人.
现在互联网上似乎有这么多资源(包括SO),找到问题的"答案"可能很容易,但如何判断答案是否有效甚至是最新的?
特别是一个领域和一个被问到很多的领域是如何使用PHP正确处理散列和加密,以便在数据库存储中做好准备.关于SO的一个常见答案似乎总是"你有没有访问过php.net?".虽然我理解这通常会出现一个问题,其中有人问最简单的问题,但我已经开始发现一些描述似乎有冲突,更重要的是,用户示例已经过时(很多来自2008-2009).
例如:在寻找为什么以及如何使用密码哈希时:http://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash
总之,我了解到sha1和md5是快速且计算效率高的哈希方法,它们不再适用于密码哈希.建议的方法是使用crypt()函数.
在了解有关crypt()以及特别是河豚哈希的更多信息时,页面上列出的规则如下:
http://www.php.net/manual/en/function.crypt.php
进一步阅读给出了一个例子:
<?php
if (CRYPT_BLOWFISH == 1) {
echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}
?>
Run Code Online (Sandbox Code Playgroud)
似乎同一页面上的示例不遵循它刚刚告诉我们使用的规则("$ 2a $ 07 $"之后的26个字符.
回报是:
河豚:
$ 2a $ 07 $ usesomesillystringfore2uDLvp1Ii2e ./ U9C8sBjqp8I90dH6hi
实际上,字符串本身确实会被改变,但几乎我的整个SALT值(上面提到的前22个字符)都是敞开的.难道这不会让我更简单地确定我的实际字符串是什么吗?
更重要的是,这只是一个例子,但最终,依赖PHP.net等资源应该有多大?
正如我的朋友Mugatu曾经说过"我觉得我正在服用疯狂的药片".
注意:上面提到的页面是自我原始发布以来编辑的,所以我无法保证自从我的原始问题和示例提供后事情没有改变.