You can encrypt a message and store in your smart contract.
But to decrypt it, the only thing you can do is to make a call() to get encrypted data from the caller. It's a special function that will only read something on the smart contract.
You can't make a transaction with the private key as an argument but it will be FORBIDDEN because anyone would see the private key on the network and you will be hacked within secondes.
I don't see the point to store an encrypted message on the blockchain. But what you can do is using EIP712.
In our project (CryptoPuzzle.com) for token n°139 own by 0xDB59, I (address 0x28B9) made a bid to buy this token.
The bid is a signed message like this :
{
expiry: 1625503749
maker: "0x28b9dd12fa0dd64fdf3f7e02a02ab87c4167342c"
makerIds: Array []
makerWei: "10000000000000000"
taker: "0x0000000000000000000000000000000000000000"
takerIds: Array [ 139 ]
takerWei: 0
sig: "0xfad5d54022f1a9d89ad0543b31dce38866e79e36cd40022ed626117ecf75d62e3e4f55d0c53f9b7a87c7acb9f8399743a9041f562e581e30a58da52dde9d8bf21b"
}
The important part is "sig" because it's EIP712 compatible so I can know that address 0x28b9 want to pay 10000000000000000 wei (0.01ETH) for token [ 139 ]. Please look at EIP712 to understand it.