Java RC4实现之间的差异

Java RC4实现之间的差异,java,node.js,cryptography,Java,Node.js,Cryptography,我必须在NodeJS中实现一个RC4密码,下面是代码: function cipher (CRYPTO, str) { const cipher = crypto.createCipher(CRYPTO.cipherAlgorithm, CRYPTO.password); return Buffer.concat([ cipher.update(str, 'utf-8'), cipher.final() ]).toString(CRYPTO.encoding); }

我必须在NodeJS中实现一个RC4密码,下面是代码:

function cipher (CRYPTO, str) {
  const cipher = crypto.createCipher(CRYPTO.cipherAlgorithm, CRYPTO.password);

  return Buffer.concat([
    cipher.update(str, 'utf-8'),
    cipher.final()
  ]).toString(CRYPTO.encoding);
}

const CRYPTO = {
  cipherAlgorithm: 'rc4',
  password: 'trololol',
  encoding: 'base64'
};

cipher(CRYPTO, '0612345678');
// returns 'yTXp/PZzn+wYsQ=='
当我使用open ssl检查我的实现时,我得到了相同的结果:

echo -ne "0612345678" |  openssl  rc4 -pass "pass:trololol" -e  -nosalt | base64
> yTXp/PZzn+wYsQ==
但在我们的合作伙伴实施下,结果确实不同。它是用Java编写的,所以我试着做了一个,结果和他一样:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import javax.xml.bind.DatatypeConverter;

public class Encryptor {
    private static String algorithm = "RC4";
    public static String encrypt(String key, String value) {
        try {
            SecretKeySpec rc4Key = new SecretKeySpec(key.getBytes(), algorithm);
            Cipher rc4 = Cipher.getInstance(algorithm);

            rc4.init(Cipher.ENCRYPT_MODE, rc4Key);
            byte [] encrypted = rc4.update(value.getBytes());
            return DatatypeConverter.printBase64Binary(encrypted);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    public static void main(String[] args) {
        String key = "trololol";
        String value = "0612345678";

        System.out.println(encrypt(key, value));
    }
}
运行上述命令可以得到:

javac Encryptor.java && java Encryptor  
> LYlbWr0URiz+wA==
Java中的RC4算法是否可能与其他算法不同,或者Java实现中是否存在错误?

区别在于“密码”与“密钥”

例如,对于node和OpenSSL,“password”表示哈希()的某些值,以生成加密/解密密钥

如果改为使用“password”值作为密钥(带空IV),则将匹配从Java接收的值。例如,对于节点,更改为
createCipheriv()
函数:

crypto.createCipheriv(CRYPTO.cipherAlgorithm, CRYPTO.password, Buffer.alloc(0));
区别在于“密码”和“密钥”

例如,对于node和OpenSSL,“password”表示哈希()的某些值,以生成加密/解密密钥

如果改为使用“password”值作为密钥(带空IV),则将匹配从Java接收的值。例如,对于节点,更改为
createCipheriv()
函数:

crypto.createCipheriv(CRYPTO.cipherAlgorithm, CRYPTO.password, Buffer.alloc(0));

请认真考虑不要使用RC4,它也是,而且在2015年2月禁止在TLS。感谢提醒,但它是我们的客户选择,尽管我们的警告,我们必须处理这一点:(请认真考虑不要使用RC4,这是2015年2月以来在TLS也禁止使用的。谢谢提醒,但这是我们的客户选择,尽管我们警告我们必须处理这个问题: