Почему не получается расшифровать 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
Я уже несколько дней пытаюсь разобраться в чем проблема, но ответов к сожалению не нашел. Может ошибка даже в самом банальном. Буду благодарен за любую обратную связь и советы на что обратить внимание