doupu3635 2017-06-30 13:17
浏览 463
已采纳

在c#中使用Rfc2898DeriveBytes和go中的pbkdf2生成相同的密钥

Why do Rfc2898DeriveBytes in C# and pbkdf2 in go lang generate different keys?

my C# code

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

public class Test
{
        private static byte[] passBytes = new byte[]
        {164,176,124,62,244,154,226,211,177,90,202,180,12,142,25,225};

        private static byte[] saltBytes = new byte[]
        {173,205,190,172,239,190,242,63,219,205,173,196,218,171,142,214};

        public static byte[] GetKey()
        {
            var key = new Rfc2898DeriveBytes(Encoding.UTF8.GetString(passBytes, 0, 16), saltBytes).GetBytes(16);
            return key;
        }

    public static void Main()
    {
        System.Console.WriteLine(Convert.ToBase64String(GetKey()));
    }
}

output: 77U85CphtSEwPP9a2T/jaQ==


golang code

package main

import (

    b64 "encoding/base64"
    "golang.org/x/crypto/pbkdf2"
    "crypto/sha1"

)

var (
    pass[]byte = []byte{164,176,124,62,244,154,226,211,177,90,202,180,12,142,25,225}
    salt[]byte = []byte{173,205,190,172,239,190,242,63,219,205,173,196,218,171,142,214}
)


func getKey() (key[]byte){
    key =  pbkdf2.Key(pass,salt,1000,16,sha1.New)
    return
}


func main() {
    print(b64.StdEncoding.EncodeToString(getKey()))
}

output: hnuuu+he4aF7vAzA8rfQtw==

Is there something different i must do?

  • 写回答

1条回答 默认 最新

  • dongmaoxi0477 2017-06-30 14:13
    关注

    You're using different variant (the constructor that takes UTF-8 string) when initializing C# instance. In addition, as already pointed by zaph, you need to use same iteration count for both C# and golang codes. The golang version takes []byte arguments both for password and salt, and the C# counterpart is Rfc2898DeriveBytes Constructor (Byte[] password, Byte[] salt, Int32 iterations).

    byte[] passBytes = new byte[]
        {164,176,124,62,244,154,226,211,177,90,202,180,12,142,25,225};
    
    byte[] saltBytes = new byte[]
        {173,205,190,172,239,190,242,63,219,205,173,196,218,171,142,214};
    
    var pbkdf2 = new Rfc2898DeriveBytes(passBytes, saltBytes, 1000);
    var key = Convert.ToBase64String(pbkdf2.GetBytes(16));
    

    The output of above code is the same with golang version.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 openwrt双栈NAT
  • ¥15 部分网页页面无法显示!
  • ¥15 怎样解决power bi 中设置管理聚合,详细信息表和详细信息列显示灰色,而不能选择相应的内容呢?
  • ¥15 QTOF MSE数据分析
  • ¥15 平板录音机录音问题解决
  • ¥15 请问维特智能的安卓APP在手机上存储传感器数据后,如何找到它的存储路径?
  • ¥15 (SQL语句|查询结果翻了4倍)
  • ¥15 Odoo17操作下面代码的模块时出现没有'读取'来访问
  • ¥50 .net core 并发调用接口问题
  • ¥15 网上各种方法试过了,pip还是无法使用