编组本机功能

Elaverick

我在C DLL中具有执行SCrypt密钥派生的功能,但是在将值编组到我的C#程序中时遇到了真正的麻烦。

函数声明在C中如下所示:

__declspec(dllexport) int scrypt(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt, size_t saltlen, uint64_t N, uint32_t r, uint32_t p,uint8_t * buf, size_t buflen);

passwd和salt都在指向uint8数组的指针中传递,N,r和p是算法的调整值。Buflen是您希望输出缓冲区为的大小。buf是输出缓冲区(所以我认为需要是ref或out);

我尝试了各种方法,最近的方法是Marshal.Copy,将数据从IntPtrs中移出到字节数组中(反之亦然),但是由于这些是UInt指针而不是IntPtr,所以我不知道那是不是对。目前,当我尝试从buf IntPtr中复制数据并将其复制回数组时,它会崩溃。

非常感谢您的协助。

class Program
{
    [DllImport("SCrypt.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
    public static extern int scrypt(IntPtr passwd, UIntPtr passwdlen, IntPtr salt, UIntPtr saltlen, UInt64 N, UInt32 r, UInt32 p, out IntPtr buf, UIntPtr buflen);

    static void Main(string[] args)
    {
        byte[] encoded = new byte[32];
        IntPtr encodedptr;

        byte[] password = System.Text.Encoding.Unicode.GetBytes("test");
        byte[] salt = System.Text.Encoding.Unicode.GetBytes("ThisistheSaltweareusingforthiskey");
        IntPtr passwordptr, saltptr;

        passwordptr = Marshal.AllocHGlobal(password.Length);
        Marshal.Copy(password, 0, passwordptr, password.Length);

        saltptr = Marshal.AllocHGlobal(salt.Length);
        Marshal.Copy(salt, 0, saltptr, salt.Length);

        int returnVal = scrypt(passwordptr, (UIntPtr)password.Length, saltptr, (UIntPtr)salt.Length, 262144, 8, 1,out encodedptr,(UIntPtr) 32);

        Marshal.Copy(encodedptr, encoded, 0, 32);

        Console.WriteLine(BitConverter.ToString(encoded));
        Console.ReadKey();
    }
}
乔伊

我可能会使用以下函数声明:

public static extern int scrypt(byte[] passwd, uint passwdlen, byte[] salt, uint saltlen, ulong N, uint r, uint p, byte[] buf, uint buflen).

请记住,封送某些类型有多种不同的方式,但是在这种情况下,上述变体可能是最清晰的,因为它直接映射到各个类型。

您可以要求astring简单地将a转换为a 对于密码,只要您转换为Unicode,一切都应该没问题。但是请确保在可能需要将密码转换为的每个位置使用相同的变体byte[]Encodingbyte[]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用多个指针在C#中编组本机.dll

来自分类Dev

使用多个指针在C#中编组本机.dll

来自分类Dev

反应本机功能问题

来自分类Dev

地图中的本机功能

来自分类Dev

需要master分支的本机功能

来自分类Dev

找不到intentservice本机功能

来自分类Dev

将类从C#编组到本机C ++时,它会克隆吗?

来自分类Dev

当将类从C#编组到本机C ++时,它会克隆吗?

来自分类Dev

在本机上使用默认功能参数

来自分类Dev

JavaScript的本机排序功能如何实现?

来自分类Dev

Android NDK找不到本机功能

来自分类Dev

如何使ListView上的滑动功能(本机)?

来自分类Dev

反应本机功能自动提交到firebase?

来自分类Dev

反应本机异步存储设置项功能

来自分类Dev

使用云功能登录以响应本机用户

来自分类Dev

使用本机功能IOS下载多个图像

来自分类Dev

JavaScript的本机排序功能如何实现?

来自分类Dev

Android NDK找不到本机功能

来自分类Dev

在本机上使用默认功能参数

来自分类Dev

从导出的类中反应本机导入功能

来自分类Dev

本机调用和应用程序调用了为另一个线程编组的接口

来自分类Dev

本机调用和应用程序调用了为另一个线程编组的接口

来自分类Dev

自定义组合禁用键的本机功能

来自分类Dev

iOS本机应用程序中标签的超链接功能

来自分类Dev

获取HID设备功能报告描述符的本机方法?

来自分类Dev

是否可以在HMR中使用本机脚本预览功能?

来自分类Dev

功能组件的this.refs(useRef,createRef)| 反应本机

来自分类Dev

为什么反应本机地图功能无法正常工作?

来自分类Dev

SafeAreaView测量功能在本机反应中不起作用

Related 相关文章

热门标签

归档