当前位置: 首页 > 知识库问答 >
问题:

加密字节数组,从字符串转换为8位整数数组

柳涵意
2023-03-14

我正在尝试用python、ecrypt数据记录音频原始数据并将其发送到。NET服务器,我在其中解密接收到的数据并转换为字节数组。当我将接收到的数据转换为字节数组时,就像这样的编码。ASCII码。GetBytes(decryptedData)一切都很正常。但最大字节值为63,发送数据的最大字节值为255。发送和接收数据的示例:

发送数据

3, 0, 3, 0, 3, 0, 4, 0, 4, 0, 2, 0, 252, 255, 1, 0, 255, 255, 1, 0, 0, 0...

接收到的数据

3, 0, 3, 0, 3, 0, 4, 0, 4, 0, 2, 0, 63, 63, 1, 0, 63, 63, 1, 0, 0, 0...

当我将接收到的数据转换为字节数组时,就像这样的编码。GetBytes(DecryptData(aes,data))一切都很正常。但高价值是不同的。发送和接收数据的示例:

发送数据

6, 0, 8, 0, 250, 255, 255, 255, 3, 0, 6, 0, 2, 0, 4, 0, 3, 0, 6, 0, 3, 0...

接收到的数据

6, 0, 8, 0, 239, 191, 189, 239, 191, 189, 239, 191, 189, 239, 191, 189, 3, 0, 6, 0, 2, 0, 4, 0, 3, 0, 6, 3, 0...

似乎转换会生成更多的变量。我不知道。

这是记录、加密和发送数据的python代码:

import pyaudio
import sys
import socket
import struct
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

key = b"bpjAqrgO2N8q7Rfj8IHzeRxmP1W4HwUTWCRi7DQgyDc="
iv = b"Ta6e1cZAWQMM0QI66JC74w=="

UDP_IP = "127.0.0.1"
UDP_PORT = 5005

chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5

pya = pyaudio.PyAudio()

stream = pya.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, output=True, frames_per_buffer=chunk)

print ("recording")
for i in range(0, 44100 // chunk * RECORD_SECONDS):
    data = stream.read(chunk)
    print (struct.unpack('{}B'.format(len(data)), data))
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    cipher_suite = AES.new(base64.urlsafe_b64decode(key), AES.MODE_CBC, base64.urlsafe_b64decode(iv))
    cipher_text = cipher_suite.encrypt(pad(data, 16))
    sock.sendto(cipher_text, (UDP_IP, UDP_PORT))
    input ()
    # check for silence here by comparing the level with 0 (or some threshold) for 
    # the contents of data.
    # then write data or not to a file

print ("done")

stream.stop_stream()
stream.close()
pya.terminate()

以下是接收、解密和转换数据的C代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace DOTNETServer
{
    class Program
    {
        private static string IP = "127.0.0.1";
        private static int Port = 5005;
        private static string Key = "bpjAqrgO2N8q7Rfj8IHzeRxmP1W4HwUTWCRi7DQgyDc=";
        private static string IV = "Ta6e1cZAWQMM0QI66JC74w==";

        static void Main(string[] args)
        {
            UDPServer(IPAddress.Parse(IP), Port);
            Console.ReadKey();
        }

        private static void UDPServer(IPAddress IP, int Port)
        {
            byte[] data = new byte[32768];
            IPEndPoint endPoint = new IPEndPoint(IP, Port);
            UdpClient client = new UdpClient(endPoint);

            SymmetricAlgorithm aes = new AesManaged();
            aes.KeySize = 256;
            aes.Key = Convert.FromBase64String(Key);
            aes.IV = Convert.FromBase64String(IV);

            while (true)
            {
                Console.WriteLine("Waiting for data.");
                data = client.Receive(ref endPoint);
                var convertedReceivedData = Encoding.ASCII.GetBytes(DecryptData(aes, data));
                Console.Write("(");
                foreach(var item in convertedReceivedData)
                {
                    Console.Write(item + ", ");
                }
                Console.Write(")");
            }
        }

        static byte[] EncryptText(SymmetricAlgorithm aesAlgorithm, string text)
        {
            ICryptoTransform encryptor = aesAlgorithm.CreateEncryptor(aesAlgorithm.Key, aesAlgorithm.IV);
            byte[] data = new byte[32768];
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter writer = new StreamWriter(cs))
                    {
                        writer.Write(text);
                    }
                }
                data = ms.ToArray();
            }

            return data;
        }

        static string DecryptData(SymmetricAlgorithm aes, byte[] data)
        {
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
            byte[] encryptedDataBuffer = data;
            string plainText = "";
            using (MemoryStream ms = new MemoryStream(encryptedDataBuffer))
            {
                using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader reader = new StreamReader(cs))
                    {
                        plainText = reader.ReadToEnd();
                    }
                }
            }

            return plainText;
        }
    }
}

共有1个答案

施念
2023-03-14

好的,我通过elgonzo的建议解决了我的问题。当然,我从数据中打印每个字节的数据字节,而无需在python中进行任何转换或解压,如下所示:

data = stream.read(chunk)
for item in data:
    print (item)

在. NET应用程序中,只需使用输入byte[]使用Rijndael加密和解密,并将byte[]作为输出,如下所示:

public static byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV)
{
    MemoryStream ms = new MemoryStream();
    Rijndael alg = Rijndael.Create();

    alg.Key = Key;
    alg.IV = IV;

    CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write);            
    cs.Write(cipherData, 0, cipherData.Length);
    cs.Close();

    return ms.ToArray();
}

再次感谢你,祝你愉快:)

 类似资料:
  • 问题内容: 我有以下代码,我试图通过测试,但似乎无法理解Java世界中各种编码形式。 我想我的问题是:将任意字节的字节数组转换为Java字符串,然后将同一Java String转换为另一个字节数组的正确方法是什么,该字节数组将具有与原始字节相同的长度和相同的内容数组? 问题答案: 尝试特定的编码: ideone链接

  • 问题内容: 因此基本上,用户是从扫描仪输入中输入序列。 等等。 它可以是任意长度,并且必须是整数。 我想将输入的字符串转换为整数数组。 所以会,就等 有什么提示和想法吗?我正在考虑实现获取先前的编号并将它们解析在一起,并将其应用于数组中的当前可用插槽。但是我不太确定如何编写代码。 问题答案: 您可以从扫描仪中读取整个输入行,然后将其分开,然后得到一个,将每个数字解析为与索引一对一匹配的…(假设输入

  • 问题内容: 我有一个接收a的函数,但是我所拥有的a是进行此转换的最佳方法是什么? 我想我可以走很长一段路,然后将其放入字符串并放入字节中,但这听起来很难看,而且我认为还有更好的方法可以做到。 问题答案: 我同意Brainstorm的方法:假设您要传递机器友好的二进制表示形式,请使用该库。OP建议可能会有一些开销。纵观源的实施,我看到它做了一些运行时的决策最大的灵活性。 对?Write()接受一个非

  • 问题内容: 我有一个要加密的字节数组,然后转换为字符串,以便可以传输。当我收到字符串时,我必须将字符串转换回字节数组,以便可以对其进行解密。我检查了接收到的字符串是否与发送的字符串(包括长度)匹配,但是当我使用诸如str.getBytes()之类的东西将其转换为字节数组时,它与我的原始字节数组不匹配。 示例输出: 任何想法如何将接收到的字符串转换为与发送的字节数组匹配的字节数组? 谢谢 问题答案:

  • 问题内容: 假设我有一个4字符串,并且我想将此字符串转换为字节数组,其中字符串中的每个字符都转换为等效的十六进制。例如 我正在尝试让我的输出成为 有没有简单的方法可以做到这一点? 问题答案: 编码功能可以为您提供帮助,编码返回字符串的编码版本 或者你可以使用数组模块

  • 问题内容: 我有一个一维String数组,我想将其转换为一维字节数组。我该怎么做呢?这需要ByteBuffer吗?我怎样才能做到这一点?(字符串可以是任意长度,只想知道如何执行这样的操作。将其转换为字节数组后,如何将其转换回String数组? -担 问题答案: 数组到数组 ,应该 手动 将其转换为两边,但是如果只有一个String,则可以和; 像这样 对于string []中的一个字节[],您必须