加密会导致错误的密钥大小错误

时间:2018-10-19 17:03:38

标签: php security encryption mcrypt

我正在创建一个随机密钥,然后我想使用一种好的算法对其进行加密,然后再使用此加密密钥对数据进行加密。我的代码是:

$iv=16; //128bits
$datakey = base64_encode(openssl_random_pseudo_bytes($iv,$strong));
$datakey = md5($datakey);
$finaldata= mcrypt_encrypt(MCRYPT_BLOWFISH, $datakey, $stringtobeencoded, MCRYPT_MODE_CFB);

错误:

  

加密模式需要大小为8的初始化向量

如何满足我的要求?

3 个答案:

答案 0 :(得分:11)

  

我想使用一种好的算法对其进行加密

您问题中包含的代码段不安全。我强烈建议:

  1. Don't use mcrypt
  2. Refer to the example code in this linked answer for how to encrypt securely

但是您得到的错误是Blowfish-CFB需要一个密钥和一个IV,而您只提供了一个密钥。

答案 1 :(得分:6)

实际错误- Encryption mode requires an initialization vector of size 8 -不是无效的密钥大小,而是缺少IV。

CFB mode需要IV(初始化向量)。 IV大小通常与块大小相同,Blowfish为64位,AES为128位。

通常最好不要使用Blowfish进行加密,即使最近它的作者也使用AES。

在保存密码验证程序时,仅使用哈希函数是不够的,仅添加盐就无法提高安全性。取而代之的是,使用随机盐在HMAC上迭代大约100毫秒的持续时间,并将盐与哈希一起保存。最好还是使用诸如PBKDF2Rfc2898DeriveBytesArgon2password_hashBcrypt之类的功能或类似功能。通过PHP使用password_hashpassword_verify,该对是安全且易于使用的。 关键是使攻击者花费大量时间通过蛮力查找密码。

最好不要使用PHP mcrypt,它是废弃软件,已经多年没有更新,并且不支持标准PKCS#7(néePKCS#5)填充,仅支持甚至不能使用的非标准null填充与二进制数据一起使用。 mcrypt具有许多可追溯到2003年的出色bugs。不建议使用mcrypt-extension,在PHP 7.2中已将其删除。与其考虑使用defuseRNCryptor,它们提供了一个完整的解决方案,并且正在维护且正确。

答案 2 :(得分:1)

您的示例中有很多内容,因为不推荐使用package cacheprocess; import java.util.ArrayList; import java.util.Scanner; public class CacheProcess { public static Color[][] mainMemory; public static ArrayList<String> Cache = new ArrayList<>(); public static void main(String[] args) { } public static void init(){ int N,M,K; float mRate, hRate; Scanner s = new Scanner(System.in); int algorithmNum; do { System.out.println("Enter N"); N = s.nextInt(); System.out.println("Enter M"); M = s.nextInt(); } while (!(((M*N)%2) == 0)); do { System.out.println("Enter number of K blocks :"); K = s.nextInt(); } while (!((K%2) == 0) && K > (N * M / 4)); do { System.out.println("Choose algorithm:"); algorithmNum = s.nextInt(); int [] h; switch(algorithmNum) { case 1: h=Algorithm1(N,M,K); break; //case 2: // h=Algorithm2(N,M,K); // break; // case 3: // h=Algorithm3(N,M,K); // System.out.println("Y Total: " + h[3]); // System.out.println("Y Miss: " + h[4]); //break; default: h=Algorithm1(N,M,K); break; } mRate=(float)h[1]/(float)h[0]; hRate=(float)h[2]/(float)h[0]; System.out.println("Total access: " + h[0]); System.out.println("Miss: " + h[1]); System.out.println("Hit: " + h[2]); System.out.println("Miss Rate: " + mRate); System.out.println("Hit Rate: " + hRate +"\n\n"); }while(true); } public static int [] Algorithm1(int N,int M, int K){ int[] result = new int[3]; mainMemory = new Color[N][M]; int miss = 0, totalAccess = 0, cellsFilled = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { mainMemory[i][j] = new Color(); mainMemory[i][j].c = 0; mainMemory[i][j].m = 0; mainMemory[i][j].y = 1; mainMemory[i][j].k = 0; } } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { Cache.add( String.valueOf(i) + String.valueOf(j)+ mainMemory[i][j].c); cellsFilled++; if(cellsFilled == K){ Cache.clear(); } if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){ miss++; totalAccess++; } Cache.add(String.valueOf(i)+String.valueOf(j)+mainMemory[i][j].m); cellsFilled++; if(cellsFilled == K){ Cache.clear(); } if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){ miss++; totalAccess++; } Cache.add((String.valueOf(i)+String.valueOf(j)+mainMemory[i][j].y)); cellsFilled++; if(cellsFilled == K){ Cache.clear(); } if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){ miss++; totalAccess++; } Cache.add((String.valueOf(i)+String.valueOf(j)+mainMemory[i][j].k)); cellsFilled++; if(cellsFilled == K){ Cache.clear(); } if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){ miss++; totalAccess++; } } } result[0]=totalAccess; result[1]=miss; result[2]=totalAccess-miss; return result; } public static boolean cacheCheck(int i, int j, int color, ArrayList<String> cache){ boolean Check = false; if(cache.size() >= 3) { String firstElement = cache.get(cache.size()-3); secondElement = cache.get(cache.size()-2); String thirdElement = cache.get(cache.size()-1); if(firstElement.equals(String.valueOf(i)) && secondElement.equals(String.valueOf(j))){ if(thirdElement.equals(String.valueOf(mainMemory[i][j].c)) || thirdElement.equals(String.valueOf(mainMemory[i][j].m)) || thirdElement.equals(String.valueOf(mainMemory[i][j].y)) || thirdElement.equals(String.valueOf(mainMemory[i][j].k))) Check = true; } } return Check; } ,所以本示例使用mcrypt_*函数。要跳过IV创建(安全性较低但更容易),请使用以下命令:

openssl_*

对于更完整的实现,包括您在原始问题中尝试生成的$plainText = 'Hello world'; $key = 'my-secret-encrpytion-key'; $algo = 'BF-CFB'; // blowfish cfb $cypherText = openssl_encrypt($plainText, $algo, $key); echo base64_encode($cypherText); // ZTVtdWNMRUp5N1dwZ2NFPQ== echo openssl_decrypt($cypherText, $algo, $key); ,以下代码将起作用:

$iv

已对其进行编辑以更正不正确的变量名。