Java中的数据加密算法,如何在.Net中实现?

Java中的数据加密算法,如何在.Net中实现?

Java中的加密算法

package interfaces.service.http.controller;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class SignUtil {
    private static final String CONTENT_CHARSET = "UTF-8";

    private static final String HMAC_ALGORITHM = "HmacSHA1";

    private static char[] base64EncodeChars = new char[]{'A', 'B', 'C', 'D',
            'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
            'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
            'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
            'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
            '4', '5', '6', '7', '8', '9', '+', '/'};

    public static String sign(String secret, String timeStr)
            throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
        //获取签名字符串
        String signStr = "date: " + timeStr + "\n" + "source: " + "source";
        //获取接口签名
        String sig;
        Mac mac1 = Mac.getInstance(HMAC_ALGORITHM);
        byte[] hash;
        SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(CONTENT_CHARSET), mac1.getAlgorithm());
        mac1.init(secretKey);
        hash = mac1.doFinal(signStr.getBytes(CONTENT_CHARSET));
        sig = encode(hash);
        return sig;
    }


    private static String encode(byte[] data) {
        StringBuffer sb = new StringBuffer();
        int len = data.length;
        int i = 0;
        int b1, b2, b3;
        while (i < len) {
            b1 = data[i++] & 0xff;
            if (i == len) {
                sb.append(base64EncodeChars[b1 >>> 2]);
                sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
                sb.append("==");
                break;
            }
            b2 = data[i++] & 0xff;
            if (i == len) {
                sb.append(base64EncodeChars[b1 >>> 2]);
                sb.append(base64EncodeChars[((b1 & 0x03) << 4)
                        | ((b2 & 0xf0) >>> 4)]);
                sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
                sb.append("=");
                break;
            }
            b3 = data[i++] & 0xff;
            sb.append(base64EncodeChars[b1 >>> 2]);
            sb.append(base64EncodeChars[((b1 & 0x03) << 4)
                    | ((b2 & 0xf0) >>> 4)]);
            sb.append(base64EncodeChars[((b2 & 0x0f) << 2)
                    | ((b3 & 0xc0) >>> 6)]);
            sb.append(base64EncodeChars[b3 & 0x3f]);
        }
        return sb.toString();
    }
}

请问如何用.Net实现上面Java代码中的签名方法?

来自NewBing和LP的编写:

  • 在.NET中实现与Java代码中相同的签名方法,你可以使用.NET中的 System.Security.Cryptography.HMACSHA1 类和 Base64 编码来实现。下面是等效的.NET代码示例:
using System;
using System.Security.Cryptography;
using System.Text;

public class SignUtil
{
    private static readonly string CONTENT_CHARSET = "UTF-8";
    private static readonly string HMAC_ALGORITHM = "HmacSHA1";

    private static char[] base64EncodeChars = new char[]
    {
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
        'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
        'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
        'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
    };

    public static string Sign(string secret, string timeStr)
    {
        string signStr = "date: " + timeStr + "\n" + "source: " + "source";
        byte[] secretBytes = Encoding.GetEncoding(CONTENT_CHARSET).GetBytes(secret);
        byte[] signBytes = Encoding.GetEncoding(CONTENT_CHARSET).GetBytes(signStr);

        using (HMACSHA1 hmac = new HMACSHA1(secretBytes))
        {
            byte[] hash = hmac.ComputeHash(signBytes);
            string sig = Encode(hash);
            return sig;
        }
    }

    private static string Encode(byte[] data)
    {
        StringBuilder sb = new StringBuilder();
        int len = data.Length;
        int i = 0;
        int b1, b2, b3;

        while (i < len)
        {
            b1 = data[i++] & 0xff;

            if (i == len)
            {
                sb.Append(base64EncodeChars[b1 >> 2]);
                sb.Append(base64EncodeChars[(b1 & 0x3) << 4]);
                sb.Append("==");
                break;
            }

            b2 = data[i++] & 0xff;

            if (i == len)
            {
                sb.Append(base64EncodeChars[b1 >> 2]);
                sb.Append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >> 4)]);
                sb.Append(base64EncodeChars[(b2 & 0x0f) << 2]);
                sb.Append("=");
                break;
            }

            b3 = data[i++] & 0xff;
            sb.Append(base64EncodeChars[b1 >> 2]);
            sb.Append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >> 4)]);
            sb.Append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >> 6)]);
            sb.Append(base64EncodeChars[b3 & 0x3f]);
        }

        return sb.ToString();
    }
}

给你个gpt连接自己输:https://www.chatnext.top/

该回答引用chatgpt: 参考一下,直接转的,不对@我,我在调整


using System;
using System.Security.Cryptography;
using System.Text;

namespace YourNamespace
{
    public class SignUtil
    {
        private static readonly Encoding ContentEncoding = Encoding.UTF8;
        private static readonly string HmacAlgorithm = "HmacSHA1";
        private static readonly char[] Base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".ToCharArray();

        public static string Sign(string secret, string timeStr)
        {
            // Get the signing string
            string signStr = $"date: {timeStr}\nsource: source";

            // Get the interface signature
            string sig;
            using (var mac1 = new HMACSHA1(Encoding.ASCII.GetBytes(secret)))
            {
                byte[] hash = mac1.ComputeHash(ContentEncoding.GetBytes(signStr));
                sig = Encode(hash);
            }

            return sig;
        }

        private static string Encode(byte[] data)
        {
            StringBuilder sb = new StringBuilder();
            int len = data.Length;
            int i = 0;
            int b1, b2, b3;

            while (i < len)
            {
                b1 = data[i++] & 0xff;
                if (i == len)
                {
                    sb.Append(Base64EncodeChars[b1 >> 2]);
                    sb.Append(Base64EncodeChars[(b1 & 0x3) << 4]);
                    sb.Append("==");
                    break;
                }
                b2 = data[i++] & 0xff;
                if (i == len)
                {
                    sb.Append(Base64EncodeChars[b1 >> 2]);
                    sb.Append(Base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >> 4)]);
                    sb.Append(Base64EncodeChars[(b2 & 0x0f) << 2]);
                    sb.Append("=");
                    break;
                }
                b3 = data[i++] & 0xff;
                sb.Append(Base64EncodeChars[b1 >> 2]);
                sb.Append(Base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >> 4)]);
                sb.Append(Base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >> 6)]);
                sb.Append(Base64EncodeChars[b3 & 0x3f]);
            }

            return sb.ToString();
        }
    }
}


该回答引用GPT

using System.Security.Cryptography;
using System.Text;

public static string Sign(string secret, string timeStr)
{
    string signStr = $"date: {timeStr}\nsource: source";
    byte[] secretBytes = Encoding.UTF8.GetBytes(secret);
    byte[] signBytes = Encoding.UTF8.GetBytes(signStr);
    using (var hmac = new HMACSHA1(secretBytes))
    {
        byte[] hash = hmac.ComputeHash(signBytes);
        string sig = Encode(hash);
        return sig;
    }
}

private static string Encode(byte[] data)
{
    StringBuilder sb = new StringBuilder();
    int len = data.Length;
    int i = 0;
    int b1, b2, b3;
    while (i < len)
    {
        b1 = data[i++] & 0xff;
        if (i == len)
        {
            sb.Append(base64EncodeChars[b1 >> 2]);
            sb.Append(base64EncodeChars[(b1 & 0x3) << 4]);
            sb.Append("==");
            break;
        }
        b2 = data[i++] & 0xff;
        if (i == len)
        {
            sb.Append(base64EncodeChars[b1 >> 2]);
            sb.Append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >> 4)]);
            sb.Append(base64EncodeChars[(b2 & 0x0f) << 2]);
            sb.Append("=");
            break;
        }
        b3 = data[i++] & 0xff;
        sb.Append(base64EncodeChars[b1 >> 2]);
        sb.Append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >> 4)]);
        sb.Append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >> 6)]);
        sb.Append(base64EncodeChars[b3 & 0x3f]);
    }
    return sb.ToString();
}

private static char[] base64EncodeChars = new char[]{
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
    'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
    'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
    'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', '0', '1', '2', '3',
    '4', '5', '6', '7', '8', '9', '+', '/'
};

基于new bing的编写参考:
Java中有很多数据加密算法,常见的包括AES、DES、RSA、MD5等等。在.Net中实现这些加密算法可以使用.Net框架提供的相应类库。

例如,使用.Net框架提供的AesManaged类来实现AES加密算法:

// 加密
public static byte[] Encrypt(string plainText, byte[] key, byte[] iv)
{
    byte[] encrypted;
    
    using (AesManaged aes = new AesManaged())
    {
        aes.Key = key;
        aes.IV = iv;

        ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter sw = new StreamWriter(cs))
                {
                    sw.Write(plainText);
                }
                encrypted = ms.ToArray();
            }
        }
    }

    return encrypted;
}

// 解密
public static string Decrypt(byte[] cipherText, byte[] key, byte[] iv)
{
    string decrypted;

    using (AesManaged aes = new AesManaged())
    {
        aes.Key = key;
        aes.IV = iv;

        ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

        using (MemoryStream ms = new MemoryStream(cipherText))
        {
            using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader reader = new StreamReader(cs))
                {
                    decrypted = reader.ReadToEnd();
                }
            }
        }
    }

    return decrypted;
}


可以看到,这段代码使用了AesManaged类来完成AES加密和解密操作。对于其他加密算法的实现也可以类似地使用.Net框架提供的相应类库来完成。

引入ChatGPT内容


using System;
using System.Security.Cryptography;
using System.Text;

namespace SignUtil
{
    public class SignUtil
    {
        private const string CONTENT_CHARSET = "UTF-8";
        private const string HMAC_ALGORITHM = "HmacSHA1";
        private static readonly char[] base64EncodeChars = new char[]{'A', 'B', 'C', 'D',
            'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
            'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
            'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
            'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
            '4', '5', '6', '7', '8', '9', '+', '/'};

        public static string Sign(string secret, string timeStr)
        {
            //获取签名字符串
            string signStr = "date: " + timeStr + "\n" + "source: " + "source";
            //获取接口签名
            string sig;
            using (var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(secret)))
            {
                var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(signStr));
                sig = Encode(hash);
            }
            return sig;
        }

        private static string Encode(byte[] data)
        {
            var sb = new StringBuilder();
            int len = data.Length;
            int i = 0;
            int b1, b2, b3;
            while (i < len)
            {
                b1 = data[i++] & 0xff;
                if (i == len)
                {
                    sb.Append(base64EncodeChars[b1 >> 2]);
                    sb.Append(base64EncodeChars[(b1 & 0x3) << 4]);
                    sb.Append("==");
                    break;
                }
                b2 = data[i++] & 0xff;
                if (i == len)
                {
                    sb.Append(base64EncodeChars[b1 >> 2]);
                    sb.Append(base64EncodeChars[((b1 & 0x03) << 4)
                            | ((b2 & 0xf0) >> 4)]);
                    sb.Append(base64EncodeChars[(b2 & 0x0f) << 2]);
                    sb.Append("=");
                    break;
                }
                b3 = data[i++] & 0xff;
                sb.Append(base64EncodeChars[b1 >> 2]);
                sb.Append(base64EncodeChars[((b1 & 0x03) << 4)
                        | ((b2 & 0xf0) >> 4)]);
                sb.Append(base64EncodeChars[((b2 & 0x0f) << 2)
                        | ((b3 & 0xc0) >> 6)]);
                sb.Append(base64EncodeChars[b3 & 0x3f]);
            }
            return sb.ToString();
        }
    }
}
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7673630
  • 这篇博客也不错, 你可以看下DES加密 java与.net可以相互加密解密的方法
  • 以下回答由chatgpt基于相关博客总结生成:

    对于如何用.Net实现Java中的数据加密算法中的签名方法,有几个解决方案可以考虑:

    1. 使用BouncyCastle库:这是一个流行的Java加密库,也有对应的.Net版本。可以使用BouncyCastle.Net中的相应类来实现Java中的签名算法。具体步骤包括:

    2. 引入BouncyCastle.Net库

    3. 创建一个KeyPairGenerator,使用RSA或者DSA算法生成一个密钥对
    4. 获取用于签名的数据的字节流,比如byte[] data
    5. 对数据进行签名,使用PrivateKeySigner的SignData方法,传入数据和私钥
    6. 对签名后的数据进行验证,使用PublicKeyVerifyer的Verify方法,传入原始数据、签名后的数据和公钥

    以下是代码示例:

    using Org.BouncyCastle.Security;
    using Org.BouncyCastle.Crypto.Parameters;
    using Org.BouncyCastle.Crypto.Signers;
    
    // 生成密钥对
    var keyPairGenerator = GeneratorUtilities.GetKeyPairGenerator("RSA");
    keyPairGenerator.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
    var keyPair = keyPairGenerator.GenerateKeyPair();
    
    // 准备数据
    byte[] data = Encoding.UTF8.GetBytes("Hello, world!");
    
    // 签名
    var signer = new RsaDigestSigner(new Sha256Digest());
    signer.Init(true, keyPair.Private);
    signer.BlockUpdate(data, 0, data.Length);
    var signature = signer.GenerateSignature();
    
    // 验证签名
    var verifier = new RsaDigestSigner(new Sha256Digest());
    verifier.Init(false, keyPair.Public);
    verifier.BlockUpdate(data, 0, data.Length);
    bool isSignatureValid = verifier.VerifySignature(signature);
    
    1. 使用.NET的内置加密机制:.NET Framework提供了System.Security.Cryptography类,可以用于实现各种加密算法,包括数字签名。具体步骤包括:

    2. 获取用于签名的数据的字节流,比如byte[] data

    3. 选择要使用的签名算法,比如RSA或者DSA
    4. 创建一个签名对象,比如RSACryptoServiceProvider或者DSACryptoServiceProvider
    5. 使用签名对象的SignData方法对数据进行签名,传入数据和私钥
    6. 使用签名对象的VerifyData方法对签名后的数据进行验证,传入原始数据、签名后的数据和公钥

    以下是代码示例:

    using System.Security.Cryptography;
    
    // 准备数据
    byte[] data = Encoding.UTF8.GetBytes("Hello, world!");
    
    // 选择算法和密钥长度
    const int keySize = 2048;
    var rsa = new RSACryptoServiceProvider(keySize);
    
    // 签名
    byte[] signature = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    
    // 验证签名
    bool isSignatureValid = rsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    

    需要注意的是,在.NET中,数字签名需要使用私钥进行签名,使用公钥进行验证。因此,在进行数字签名时,需要确保拥有私钥。