Почему не получается расшифровать message из websocket?

Я пытаюсь реализовать шифровку и дешифровку сообщений в приложении чата. Для шифрования использую библитеку [email protected].

import React, { useCallback, useMemo, useState } from 'react';
        import { useCookies } from 'react-cookie';
        import { TopBar } from './TopBar/TopBar';
        import { BottomBar } from './BottomBar/BottomBar';
        import { MessageItem } from './MessageItem/MessageItem';
        import { useParams } from 'react-router-dom';
        import { Imessage } from '../model/types/types';
        import { useGetCurrentRoom } from '../api/chatApi';
        import { useSocket } from 'shared/lib/hooks/useSocket/useSocket';
        import { socketDomain } from 'shared/api/api';
        import { Redirect } from 'shared/ui/Redirect/Redirect';
        import cls from './Chat.module.scss'
        import { encryptText } from '../lib/encryptText';
        import { pki } from 'node-forge';
        import { decryptText } from '../lib/decryptText';
        import { handleMessages } from '../lib/handleMessages';
    
    
        const Chat = () => {
            const [cookies] = useCookies(['privedUser'])
            const { chatId } = useParams()
            const [messages, setMessages] = useState<Imessage[]>([])
            const {
                data: currentRoom,
                isLoading: isCurrentRoomLoading,
                isError: CurrentRoomLoadingError } = useGetCurrentRoom({ roomId: chatId! })
            
            const keys = useMemo(() => {
                const keyPair = pki.rsa.generateKeyPair({bits: 2048})
                const privateKeyPem = pki.privateKeyToPem(keyPair.privateKey)
                const publicKeyPem = pki.publicKeyToPem(keyPair.publicKey)
                return {
                    private:privateKeyPem,
                    publicKeyPem: publicKeyPem
                }
            },[])
    
            const { socketOpened, socketError, sendMessage } = useSocket({
                socketUrl: `${socketDomain}/ws/chat/${chatId}/?password=123123123&privedUser=${cookies.privedUser}`,
                onMessage: (e) => {
                    const data = JSON.parse(e.data)
                    switch (data.type) {
                    case 'last_50_messages':
                        setMessages(data.messages)
                        break;
                    case 'chat_message_echo':
                        setMessages(messages => [data.message, ...messages])
                        break;
                    default:
                        break;
                    }
                }
            })
            const onSendMessage = useCallback((message:string) => {
                const encryptedMsg = encryptText(message, keys.publicKeyPem )
                sendMessage(encryptedMsg) 
            }, [sendMessage, keys])
            const encryptedMessage = messages[0]?.text
            if (encryptedMessage !== undefined) {
                 const decryptedMessage = decryptText(encryptedMessage, privateKeyPem)
                 console.log(decryptedMessage)
             }
            
            const checkUser = (userId: string) => userId === cookies.privedUser
                
            const room =  CurrentRoomLoadingError ? {
                "id": Number(chatId),
                "name": "123",
                "date": "2022-11-21T14:12:49.393506Z"
            } : currentRoom
    
            if (socketError) return <Redirect />
    
            if (socketOpened && !isCurrentRoomLoading)
    
                return (
                    <section className={cls.section}>
                        <TopBar currentRoom={room!} />
                        <div className={cls.list}>
                            {messages.map(({ id, user, ...rest }) => (
                                <MessageItem key={id} type={checkUser(user.id) ? 'self' : 'other'} {...rest} />
                            ))}
                        </div>
                        <BottomBar sendMessage={onSendMessage} />
    
                    </section>
                );
        };
    
        export default Chat;
import { pki, util,  } from "node-forge";
        
            export const decryptText = (message:string, key:string) => {
                const privateKey = pki.privateKeyFromPem(key);
                const plaintextBytes = privateKey.decrypt(util.decode64(message));
                return plaintextBytes;
                
            }
import { pki, util } from "node-forge";
                export const encryptText = (message: string, key:string) :string => {
                    const publicKey = pki.publicKeyFromPem(key);
                    const encrypted = publicKey.encrypt(message);
                    return util.encode64(encrypted);
                }

Проблема заключается в том что если сообщение не отправлять на сервер, а получить сообщение, зашифровать его и на следующей строке дешифровать то оно дешифруется успешно. Вот код показывающий это:

 const onSendMessage = useCallback((message:string) => {
             const encryptedMsg = encryptText(message, keys.public )
             const decryptedMessage = decryptText(encryptedMsg, keys.private)
             console.log(decryptedMessage) // hello
             sendMessage(encryptedMsg) 
        }, [sendMessage, keys])

А при попытке дешифровать сообщение которое пришло из websocket появляется вот такая ошибка:

Uncaught Error: Encryption block is invalid.
    at Object._decodePkcs1_v1_5 [as decode] (rsa.js:1654:1)
    at key.decrypt (rsa.js:1291:1)
    at decryptText (decryptText.ts:4:1)

Т.е ошибка возникает когда я пытаюсь расшифровать сообщение: const plaintextBytes = privateKey.decrypt(util.decode64(message)); Ответ который возвращает websocket после JSON.parse() выглядит так:

{text:"IgkbzsnWZzqL99+Vqoogl8T4iYNq5Qeh3gBo7A8zr8KQ/EFS/5gyZJSrcPHGezjc/h3LjIMsPUd3BSGpOQsssFJphHhLybTQcERKTjcT+XdPMxJdu0gSxH/TMhyYhyzBNoVUEtM7dDDQLflwcnfZu16Vmk9L5CuHW60EjzZ/5C8LCPi83p/vyAzEuRVYLVbyYWh5vLzvOTYmnf7iyrDFA5aJUU7OUvAKEbh2DW62HrkbN+vAhjfgqxzMMq8N7GU3GIwcR6FU6W92Old8vUdUnUepweivxSMx+fExB3w4/tEFTGCX/SOwd7rHjdgYcjyXuOr3vIjmwsLCcTSQtK3VQQ=="
}

Я так понимаю что расшифровываю сообщение в верной кодировке. Я поискал похожие проблемы, но на них либо нет ответа, либо ответ не помог чтобы решить проблему:

RSA Private Key Decrypt - Error: Encryption block is invalid

Error: Encryption block is invalid

Я уже несколько дней пытаюсь разобраться в чем проблема, но ответов к сожалению не нашел. Может ошибка даже в самом банальном. Буду благодарен за любую обратную связь и советы на что обратить внимание


Ответы (0 шт):