微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

加密和解密音频剪辑到文件统一

如何解决加密和解密音频剪辑到文件统一

我使用 AES 进行加密和解密,我可以将其写入文件,当我尝试将文件读回音频剪辑时,出现输入异常

我尝试在保存文件时将音频文件转换为 base64 字节数组,以便在读取文件时可以将其作为创建音频剪辑所需的字节数组读取

我附上了下面的代码

 private float[] ConvertBytetoFloat(byte[] array)
{
    float[] floatArr = new float[array.Length / 4];
    for (int i = 0; i < floatArr.Length; i++)
    {
        if (BitConverter.IsLittleEndian)
        {
            Array.Reverse(array,i * 4,4);
        }
        floatArr[i] = BitConverter.ToSingle(array,i * 4) / 0x80000000;
    }
    return floatArr;
}

public void ReadFile()
{
    // Does the file exist AND does the "key" preference exist?
    if (File.Exists(saveFile) && PlayerPrefs.HasKey("Key"))
    {
        // Update key based on PlayerPrefs
        // (Convert the String into a Base64 byte[] array.)
        byte[] savedKey = Convert.FromBase64String(PlayerPrefs.GetString("Key"));
        byte[] savedIV = Convert.FromBase64String(PlayerPrefs.GetString("IV"));

        // Create FileStream for opening files.
        dataStream = new FileStream(saveFile,FileMode.Open);

        Debug.Log(PlayerPrefs.GetString("Key"));

        // Create new AES instance.
        Aes oAes = Aes.Create();

        // Create an array of correct size based on AES IV.
        byte[] outputIV = new byte[savedIV.Length];

        // Read the IV from the file.
        dataStream.Read(savedIV,outputIV.Length);

        // Create CryptoStream,wrapping FileStream
        CryptoStream oStream = new CryptoStream(dataStream,oAes.CreateDecryptor(savedKey,outputIV),CryptoStreamMode.Read);

        // Create a StreamReader,wrapping CryptoStream
        StreamReader reader = new StreamReader(oStream);

        // Read the entire file into a String value.
        string text = reader.ReadToEnd();

        byte[] songDataBytes = Convert.FromBase64String(text);

        AudioClip audioClip = AudioClip.Create("SongName",songDataBytes.Length,1,48000,false);
        float[] f = ConvertBytetoFloat(songDataBytes);
        audioClip.SetData(f,0);
        ass.clip = audioClip;
        ass.Play();

        Debug.Log("C");
        // Deserialize the JSON data 
        //  into a pattern matching the GameData class.
        //gameData = JsonUtility.FromJson<GameData>(text);
    }
    Debug.Log("D");
}



public void WriteFile()
{
    string songLoc = Application.persistentDataPath + "/song.mp3";

    // Create new AES instance.
    Aes iAes = Aes.Create();

    // Update the internal key.
    string key = PlayerPrefs.GetString("Key");
    string IV = PlayerPrefs.GetString("Key");

    byte[] savedKey;
    byte[] savedIV;

    if (key == "")
    {
        iAes.GenerateIV();
        savedKey = iAes.Key;
        savedIV = iAes.IV;
        key = Convert.ToBase64String(savedKey);
        IV = Convert.ToBase64String(savedIV);
    }
    else
    {
        savedIV = Convert.FromBase64String(PlayerPrefs.GetString("IV"));
        savedKey = Convert.FromBase64String(PlayerPrefs.GetString("Key"));
    }

    Debug.Log(key);

    // Convert the byte[] into a Base64 String.
    //string key = System.Convert.ToBase64String(savedKey);

    // Update the PlayerPrefs
    PlayerPrefs.SetString("Key",key);
    PlayerPrefs.SetString("IV",IV);


    // Create a FileStream for creating files.
    dataStream = new FileStream(saveFile,FileMode.Create);

    // Save the new generated IV.
    byte[] inputIV = savedIV;

    // Write the IV to the FileStream unencrypted.
    dataStream.Write(inputIV,inputIV.Length);

    // Create CryptoStream,wrapping FileStream.
    CryptoStream iStream = new CryptoStream(dataStream,iAes.CreateEncryptor(savedKey,savedIV),CryptoStreamMode.Write);

    // Create StreamWriter,wrapping CryptoStream.
    StreamWriter sWriter = new StreamWriter(iStream);

    // Serialize the object into JSON and save string.
    byte[] songData = File.ReadAllBytes(songLoc);

    //string songString = Convert.ToBase64String(songData);
    //File.WriteallBytes(saveFile,songData);

    // Write to the innermost stream (which will encrypt).
    sWriter.BaseStream.Write(songData,songData.Length);

    // Close StreamWriter.
    sWriter.Close();

    // Close CryptoStream.
    iStream.Close();

    // Close FileStream.
    dataStream.Close();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。