Аргумент типа ‘string | undefined’ не может быть присвоен параметру типа ‘ArrayBuffer | SharedArrayBuffer’

#node.js #typescript #cryptojs

#node.js #typescript #cryptojs

Вопрос:

Я внедрил метод шифрования в node, который работает правильно, но у меня возникают проблемы с расшифровкой из-за проблем с машинописным текстом. Это мой метод шифрования, который работает просто отлично, и пример, которому я следую

пример

 private encryptWifiPassword = (param1: string, password: string) => {

        const ENCRYPTION_KEY = param1.padStart(32, '0'); // Must be 256 bits (32 characters)
        const IV_LENGTH = 16; // For AES, this is always 16

        const iv = crypto.randomBytes(IV_LENGTH);
        const cipher = crypto.createCipheriv('aes-256-gcm', Buffer.from(ENCRYPTION_KEY), iv);
        let encrypted = cipher.update('prefix'  password);
        encrypted = Buffer.concat([encrypted, cipher.final()]);

        const pskEncripted = iv.toString('base64')   ':'   encrypted.toString('base64')
            return pskEncripted
};

 

Это мой метод дешифрования, который не будет работать

   private decryptWifiPassword(param1: string, password: string): string {

        const ENCRYPTION_KEY = param1.padStart(32, '0')
        let textParts = password.split(':');
     
        let iv = Buffer.from(textParts.shift(),'base64'); //this is the part with the issue
        
        let encryptedText = Buffer.from(textParts.join(':'), 'base64');
      
        let decipher = crypto.createDecipheriv('aes-256-gcm', Buffer.from(ENCRYPTION_KEY), iv);
       let decrypted = decipher.update(encryptedText);
      
       decrypted = Buffer.concat([decrypted, decipher.final()]);
       
       return decrypted.toString();
    
}


 

Когда я пытаюсь расшифровать, я получаю следующее сообщение:

 No overload matches this call.

  Overload 1 of 5, '(arrayBuffer: ArrayBuffer | SharedArrayBuffer, byteOffset?: number | undefined, length?: number | undefined): Buffer', gave the following error.
    Argument of type 'string | undefined' is not assignable to parameter of type 'ArrayBuffer | SharedArrayBuffer'.
      Type 'undefined' is not assignable to type 'ArrayBuffer | SharedArrayBuffer'.
  Overload 2 of 5, '(obj: { valueOf(): string | object; } | { [Symbol.toPrimitive](hint: "string"): string; }, byteOffset?: number | undefined, length?: number | undefined): Buffer', gave the following error.
    Argument of type 'string | undefined' is not assignable to parameter of type '{ valueOf(): string | object; } | { [Symbol.toPrimitive](hint: "string"): string; }'.
      Type 'undefined' is not assignable to type '{ valueOf(): string | object; } | { [Symbol.toPrimitive](hint: "string"): string; }'.
  Overload 3 of 5, '(str: string, encoding?: "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex" | undefined): Buffer', gave the following error.
    Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
      Type 'undefined' is not assignable to type 'string'.
 

Я попытался сделать это —> let iv = Buffer.from(textParts[0],’base64′); но это то, что я получаю как расшифровку

  Decipheriv {
  _decoder: null,
 _options: undefined,
  [Symbol(kHandle)]: {}
 }

 

Также я пробовал это, но это тоже не работает

 let iv = Buffer.from(textParts.shift(),'base64') as string

 

Я новичок в криптографии, и любая помощь была бы отличной.

Заранее большое вам спасибо.

Ответ №1:

TypeScript сообщает вам, что возвращаемый тип textParts.shift() является возможным undefined . Вам нужно либо проверить в своей функции, что значение не undefined является перед вызовом Buffer.from() , либо использовать ненулевое утверждение:

 let iv = Buffer.from(textParts.shift()!, 'base64');