有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

c#反向工程基于Java的加密

我试图用C#对这段Java代码进行反向工程,但我一直得到错误的结果:

public static String GetEncodedToken(String tokenBase64) {
    String str2 = "";
    try {
        byte[] ivBytes = Base64Coder.decode("OSMqNE11fGUoLDg5Mmk1WQ==");
        byte[] keyBytes = Base64Coder.decode("Nm4wMy5nOiM3JSpWfnwzOXFpNzRcfjB5MVNEKl8mWkw=");
        byte[] tokenBytes = Base64Coder.decode(tokenBase64);
        byte[] tokenEncBytes = Encrypt(ivBytes, keyBytes, tokenBytes);
        str2 = URLEncoder.encode(Base64Coder.encode(tokenEncBytes), "UTF-8");
    } catch (Exception e) {
    }
    return str2;
}

private static byte[] Encrypt(byte[] ivBytes, byte[] keyBytes, byte[] tokenBytes) throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalStateException, IllegalBlockSizeException, BadPaddingException {
    AlgorithmParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);
    Key secretKeySpec = new SecretKeySpec(keyBytes, "AES");
    Cipher instance = Cipher.getInstance("AES/CBC/PKCS5Padding");
    instance.init(1, secretKeySpec, ivParameterSpec); // 1 = CipherMode.CBC in C#???
    return instance.doFinal(tokenBytes);
}

据我所知,上面C#中的代码翻译成以下代码片段:

public static string GetEncodedToken(string tokenBase64)
{
    var ivBytes = Convert.FromBase64String("OSMqNE11fGUoLDg5Mmk1WQ==");
    var keyBytes = Convert.FromBase64String("Nm4wMy5nOiM3JSpWfnwzOXFpNzRcfjB5MVNEKl8mWkw=");
    var tokenBytes = Convert.FromBase64String(tokenBase64);
    var tokenEncBytes = Crypt.Encrypt(tokenBytes, keyBytes, ivBytes);
    var tokenEnc = HttpUtility.UrlEncode(Convert.ToBase64String(tokenEncBytes));

    return tokenEnc;
}

private static byte[] Encrypt(byte[] tokenBytes, byte[] keyBytes, byte[]  ivBytes)
{
    using (var rijndaelManaged = new RijndaelManaged
    {
        Mode = CipherMode.CBC,
        Padding = PaddingMode.PKCS7,
        KeySize = 128,
        BlockSize = 128,
        Key = keyBytes,
        IV = ivBytes
    })
    {
        return rijndaelManaged.CreateEncryptor()
            .TransformFinalBlock(tokenBytes, 0, tokenBytes.Length);
    }
}

然而,我试图通过C#client登录的API告诉我令牌是错误的:(


共 (0) 个答案