我使用javax.crypto.Cipher org.apache.commons.codec.binary.Base64创建了密文,并使用Java如下所示:

import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public final class PwdCipher {

    private static final Logger LOG = LoggerFactory.getLogger(PwdCipher.class);

    private static final int BASE64_ARG0 = 32;

    private static final String SECRET = "tvnw63ufg9gh5392";

    private static byte[] linebreak = {};
    private static SecretKey key;
    private static Cipher cipher;
    private static Base64 coder;

    static {
            key = new SecretKeySpec(SECRET.getBytes(), "AES");
            try {
                cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
            } catch (NoSuchAlgorithmException | NoSuchProviderException | NoSuchPaddingException e) {
                LOG.debug("Erro ao criar encriptador.", e);
            }
            coder = new Base64(BASE64_ARG0, linebreak, true);
    }

    private PwdCipher(){
    }

    public static synchronized String encrypt(String plainText) {
        try {
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] cipherText = cipher.doFinal(plainText.getBytes());
            return new String(coder.encode(cipherText));
        } catch (Exception e) {
            throw new GdocException("Erro ao encriptar senha.", e);
        }
    }

    public static synchronized String decrypt(String codedText) {
        try {
            byte[] encypted = coder.decode(codedText.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] decrypted = cipher.doFinal(encypted);
            return new String(decrypted);
        } catch (Exception e) {
            throw new GdocException("Erro ao decriptar senha.", e);
        }
    }

}

我需要使用Node.js解密文本(使用PwdCipher类加密),但是当我使用以下代码时:
exports.decryptLdapPassword = function(password){
  var key = 'tvnw63ufg9gh5392';

  var ciphertext = password;

  var crypto = require('crypto');
  var decipher = crypto.createDecipher('aes-128-ecb', key);

  var decrypted = decipher.update(ciphertext, 'base64', 'utf8');
  decrypted += decipher.final('utf8');

  return decrypted;
};

结果发现以下异常:
> crypto.js:323   var ret = this._binding.final();
>                           ^ TypeError: error:00000000:lib(0):func(0):reason(0)
>     at Decipher.Cipher.final (crypto.js:323:27)
>     at Object.exports.decryptLdapPassword (C:\ProjetosTFS\GDOC\fSuporte\GDoc\Versionado\Fontes\woodstock\server\api\service\service.util.js:14:25)
>     at Promise.<anonymous> (C:\ProjetosTFS\GDOC\fSuporte\GDoc\Versionado\Fontes\woodstock\server\api\service\service.controller.js:111:34)
>     at Promise.<anonymous> (C:\ProjetosTFS\GDOC\fSuporte\GDoc\Versionado\Fontes\woodstock\node_modules\mongoose\node_modules\mpromise\lib\promise.js:177:8)
>     at Promise.emit (events.js:95:17)
>     at Promise.emit (C:\ProjetosTFS\GDOC\fSuporte\GDoc\Versionado\Fontes\woodstock\node_modules\mongoose\node_modules\mpromise\lib\promise.js:84:38)
>     at Promise.fulfill (C:\ProjetosTFS\GDOC\fSuporte\GDoc\Versionado\Fontes\woodstock\node_modules\mongoose\node_modules\mpromise\lib\promise.js:97:20)
>     at Promise.resolve (C:\ProjetosTFS\GDOC\fSuporte\GDoc\Versionado\Fontes\woodstock\node_modules\mongoose\lib\promise.js:114:23)
>     at Promise.<anonymous> (C:\ProjetosTFS\GDOC\fSuporte\GDoc\Versionado\Fontes\woodstock\node_modules\mongoose\node_modules\mpromise\lib\promise.js:177:8)
>     at Promise.emit (events.js:95:17)

任何想法?

最佳答案

工作了!解决方案在https://github.com/joyent/node/issues/20983#issuecomment-100885608中发布

07-24 09:38
查看更多